Explorar o código

feat: 第一次提交

bianzhenhua123 hai 2 meses
achega
7ccf8b2480
Modificáronse 100 ficheiros con 11109 adicións e 0 borrados
  1. 26 0
      .gitignore
  2. 171 0
      auction-order/pom.xml
  3. 22 0
      auction-order/src/main/java/com/AuctionOrderApplication.java
  4. 267 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderController.java
  5. 54 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderListController.java
  6. 94 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderPriController.java
  7. 46 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/OrderController.java
  8. 124 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/RechargeOrderController.java
  9. 104 0
      auction-order/src/main/java/com/poyee/auctionorder/controller/VendingMachineOrderController.java
  10. 179 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderDto.java
  11. 41 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderEntry.java
  12. 113 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderListDto.java
  13. 167 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/CerificationOrderDto.java
  14. 53 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/OrderBaseEntity.java
  15. 78 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/OrderBayInfoEntry.java
  16. 35 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/OrderRefundInfoEntry.java
  17. 65 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/QualifedRuleInfoDto.java
  18. 56 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/QualifedRuleInfoEntity.java
  19. 167 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/RechargeOrderDto.java
  20. 53 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/RechargeOrderEntity.java
  21. 27 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/UserAuctionOrderEntry.java
  22. 202 0
      auction-order/src/main/java/com/poyee/auctionorder/dto/VendingMachineOrderDto.java
  23. 252 0
      auction-order/src/main/java/com/poyee/auctionorder/entity/AuctionOrder.java
  24. 133 0
      auction-order/src/main/java/com/poyee/auctionorder/entity/AuctionOrderList.java
  25. 18 0
      auction-order/src/main/java/com/poyee/auctionorder/mapper/AuctionOrderListMapper.java
  26. 50 0
      auction-order/src/main/java/com/poyee/auctionorder/mapper/AuctionOrderMapper.java
  27. 29 0
      auction-order/src/main/java/com/poyee/auctionorder/mq/MqService.java
  28. 26 0
      auction-order/src/main/java/com/poyee/auctionorder/mq/PayPreCallBackConsumer.java
  29. 15 0
      auction-order/src/main/java/com/poyee/auctionorder/mq/dto/PointOrderInfo.java
  30. 21 0
      auction-order/src/main/java/com/poyee/auctionorder/service/IAuctionOrderListService.java
  31. 40 0
      auction-order/src/main/java/com/poyee/auctionorder/service/IAuctionOrderService.java
  32. 38 0
      auction-order/src/main/java/com/poyee/auctionorder/service/OrderService.java
  33. 15 0
      auction-order/src/main/java/com/poyee/auctionorder/service/VendingMachineOrderService.java
  34. 34 0
      auction-order/src/main/java/com/poyee/auctionorder/service/impl/AuctionOrderListServiceImpl.java
  35. 851 0
      auction-order/src/main/java/com/poyee/auctionorder/service/impl/AuctionOrderServiceImpl.java
  36. 858 0
      auction-order/src/main/java/com/poyee/auctionorder/service/impl/OrderServiceImpl.java
  37. 155 0
      auction-order/src/main/java/com/poyee/auctionorder/service/impl/VendingMachineOrderServiceImpl.java
  38. 42 0
      auction-order/src/main/java/com/poyee/base/controller/SysBaseController.java
  39. 21 0
      auction-order/src/main/java/com/poyee/base/dto/DataEntry.java
  40. 33 0
      auction-order/src/main/java/com/poyee/base/dto/DictBaseDto.java
  41. 221 0
      auction-order/src/main/java/com/poyee/base/dto/OrderBaseInfoDto.java
  42. 7 0
      auction-order/src/main/java/com/poyee/base/dto/SysBaseDto.java
  43. 277 0
      auction-order/src/main/java/com/poyee/base/dto/SysFinanceDto.java
  44. 120 0
      auction-order/src/main/java/com/poyee/base/dto/UserBankInfoDto.java
  45. 186 0
      auction-order/src/main/java/com/poyee/base/entity/MerchantInfo.java
  46. 7 0
      auction-order/src/main/java/com/poyee/base/entity/SysBase.java
  47. 124 0
      auction-order/src/main/java/com/poyee/base/entity/UserBankInfo.java
  48. 88 0
      auction-order/src/main/java/com/poyee/base/mapper/SysBaseMapper.java
  49. 25 0
      auction-order/src/main/java/com/poyee/base/mapper/UserBankInfoMapper.java
  50. 17 0
      auction-order/src/main/java/com/poyee/base/service/IUserBankInfoService.java
  51. 16 0
      auction-order/src/main/java/com/poyee/base/service/SysBaseService.java
  52. 86 0
      auction-order/src/main/java/com/poyee/base/service/impl/SysBaseServiceImpl.java
  53. 20 0
      auction-order/src/main/java/com/poyee/base/service/impl/UserBankInfoServiceImpl.java
  54. 59 0
      auction-order/src/main/java/com/poyee/util/AuctionConstant.java
  55. 51 0
      auction-order/src/main/java/com/tzy/sportcard/point/domain/AppUserPointRecord.java
  56. 60 0
      auction-order/src/main/resources/application-dev.yml
  57. 68 0
      auction-order/src/main/resources/application-prod.yml
  58. 168 0
      auction-order/src/main/resources/application.yml
  59. 21 0
      auction-order/src/main/resources/logback-fluentd.xml
  60. 50 0
      auction-order/src/main/resources/logback.xml
  61. 37 0
      auction-order/src/main/resources/mapper/AuctionOrderListMapper.xml
  62. 65 0
      auction-order/src/main/resources/mapper/AuctionOrderMapper.xml
  63. 5 0
      auction-order/src/main/resources/mapper/IBaseMapper.xml
  64. 232 0
      auction-order/src/main/resources/mapper/SysBaseMapper.xml
  65. 13 0
      auction-order/src/test/java/com/poyee/auctionorder/AuctionOrderApplicationTests.java
  66. 312 0
      pom.xml
  67. 259 0
      poyee-base/pom.xml
  68. 107 0
      poyee-base/src/main/java/com/poyee/base/controller/BaseController.java
  69. 163 0
      poyee-base/src/main/java/com/poyee/base/dto/AppBaseUser.java
  70. 13 0
      poyee-base/src/main/java/com/poyee/base/dto/Pays.java
  71. 403 0
      poyee-base/src/main/java/com/poyee/base/dto/Result.java
  72. 67 0
      poyee-base/src/main/java/com/poyee/base/dto/UserInfo.java
  73. 53 0
      poyee-base/src/main/java/com/poyee/base/entity/BaseEntity.java
  74. 10 0
      poyee-base/src/main/java/com/poyee/base/mapper/IBaseMapper.java
  75. 49 0
      poyee-base/src/main/java/com/poyee/base/service/BaseService.java
  76. 654 0
      poyee-base/src/main/java/com/poyee/base/service/impl/BaseServiceImpl.java
  77. 95 0
      poyee-base/src/main/java/com/poyee/common/constant/Constants.java
  78. 25 0
      poyee-base/src/main/java/com/poyee/common/constant/SystemConstant.java
  79. 77 0
      poyee-base/src/main/java/com/poyee/common/dto/Result.java
  80. 19 0
      poyee-base/src/main/java/com/poyee/common/enums/BusinessStatus.java
  81. 69 0
      poyee-base/src/main/java/com/poyee/common/enums/BusinessType.java
  82. 27 0
      poyee-base/src/main/java/com/poyee/common/enums/DataAuth.java
  83. 12 0
      poyee-base/src/main/java/com/poyee/common/enums/DesensitType.java
  84. 29 0
      poyee-base/src/main/java/com/poyee/common/enums/OperatorType.java
  85. 102 0
      poyee-base/src/main/java/com/poyee/common/exception/BaseException.java
  86. 41 0
      poyee-base/src/main/java/com/poyee/common/exception/BusinessException.java
  87. 132 0
      poyee-base/src/main/java/com/poyee/common/exception/GlobalExceptionHandler.java
  88. 42 0
      poyee-base/src/main/java/com/poyee/common/exception/ServiceException.java
  89. 25 0
      poyee-base/src/main/java/com/poyee/common/swagger/ArrayRefProperty.java
  90. 202 0
      poyee-base/src/main/java/com/poyee/common/swagger/SwaggerUiController.java
  91. 213 0
      poyee-base/src/main/java/com/poyee/common/swagger/SwaggerUtil.java
  92. 145 0
      poyee-base/src/main/java/com/poyee/common/swagger/TestController.java
  93. 183 0
      poyee-base/src/main/java/com/poyee/common/util/EscapeUtil.java
  94. 566 0
      poyee-base/src/main/java/com/poyee/common/util/HTMLFilter.java
  95. 17 0
      poyee-base/src/main/java/com/poyee/common/util/LogSyncUtil.java
  96. 26 0
      poyee-base/src/main/java/com/poyee/common/util/MessageUtils.java
  97. 93 0
      poyee-base/src/main/java/com/poyee/common/xss/XssFilter.java
  98. 45 0
      poyee-base/src/main/java/com/poyee/common/xss/XssHttpServletRequestWrapper.java
  99. 20 0
      poyee-base/src/main/java/com/poyee/framework/annotation/Desensit.java
  100. 16 0
      poyee-base/src/main/java/com/poyee/framework/annotation/DesensitMethod.java

+ 26 - 0
.gitignore

@@ -0,0 +1,26 @@
+/auction-order/target/
+/poyee-base/target/
+/poyee-pay/target/
+
+
+*.idea
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+*.iml

+ 171 - 0
auction-order/pom.xml

@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>poyee</artifactId>
+        <groupId>com.poyee</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <groupId>com.poyee</groupId>
+    <artifactId>auction-order</artifactId>
+    <version>1.0.0</version>
+
+    <name>订单</name>
+    <description>订单</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!-- SpringBoot 拦截器 -->
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+<!--        热更新-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!--阿里数据库连接池 -->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid-spring-boot-starter</artifactId>-->
+<!--            <version>${druid.version}</version>-->
+<!--        </dependency>-->
+        <!-- swagger2-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+        </dependency>
+
+        <!--io常用工具类 -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>2.11.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>poyee-base</artifactId>
+        </dependency>
+<!--        快递-->
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>poyee-courier</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>poyee-checklist</artifactId>
+        </dependency>
+
+        <!-- logback fluentd -->
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.sndyuk</groupId>
+            <artifactId>logback-more-appenders</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.fluentd</groupId>
+            <artifactId>fluent-logger</artifactId>
+        </dependency>
+
+        <!-- actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.0.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 22 - 0
auction-order/src/main/java/com/AuctionOrderApplication.java

@@ -0,0 +1,22 @@
+package com;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class},scanBasePackages = "com")
+@EnableAsync
+@EnableAspectJAutoProxy(proxyTargetClass = true)
+@Slf4j
+public class AuctionOrderApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AuctionOrderApplication.class, args);
+        log.info("(♥◠‿◠)ノ゙ 启动成功   ლ(´ڡ`ლ)゙");
+    }
+
+}

+ 267 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderController.java

@@ -0,0 +1,267 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.*;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.service.IAuctionOrderService;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.common.exception.ServiceException;
+import com.poyee.courier.service.IOrderCourierRecordService;
+import com.poyee.framework.annotation.Log;
+import com.poyee.framework.annotation.UserLoginToken;
+import com.poyee.util.AuctionConstant;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 拍卖订单-主表 前端控制器
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Slf4j
+@Api("拍卖订单接口")
+@RestController
+@RequestMapping("/v1/api/auctionOrder")
+public class AuctionOrderController extends BaseController<IAuctionOrderService, AuctionOrder,AuctionOrderDto> {
+
+    @Autowired
+    private IOrderCourierRecordService orderCourierRecordService;
+    @Autowired
+    private OrderService orderService;
+
+    /**
+     * 查询账户保证金及账户保证积分
+     * @return
+     */
+    @ApiOperation(value = "查询账户保证金及账户保证积分@(1.0)" ,notes = "查询账户保证金及账户保证积分")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果:data{point:积分,amount:金额,accountPoint:积分,accountAmount:金额}" )
+    })
+    @Log(title = "查询账户保证金及账户保证积分", businessType = BusinessType.SEARCH)
+    @UserLoginToken(faceVerify = false) //接口不验证头部信息
+    @PostMapping("/searchAccountBond")
+    @ResponseBody
+    public Result searchAccountBond(@RequestBody QualifedRuleInfoDto qualifedRuleInfoDto){
+        log.info(" 请求参数 》》》 {}",qualifedRuleInfoDto);
+        AppBaseUser appUserInfo = getAppUserInfo();
+        qualifedRuleInfoDto.setAccountId(String.valueOf(appUserInfo.getId()));
+        qualifedRuleInfoDto.setOrderType("auction");
+        Result result = baseService.searchAccountBond(qualifedRuleInfoDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 创建保证金订单
+     * @return
+     */
+    @ApiOperation(value = "创建保证金订单@(1.0)" ,notes = "保证金订单")
+    @ApiImplicitParam(name="拍卖/保证金订单",dataTypeClass = CerificationOrderDto.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "保证金订单", businessType = BusinessType.INSERT)
+    @UserLoginToken
+    @PostMapping("/createCerificationOrder")
+    @ResponseBody
+    public Result<AuctionOrderDto> createCerificationOrder(@RequestBody @Validated CerificationOrderDto auctionOrderDto){
+        log.info(" 请求参数 》》》 {}",auctionOrderDto);
+        //设置默认值
+        String orderType = StringUtils.isEmpty(auctionOrderDto.getOrderType()) ? AuctionConstant.ORDER_TYPE_BOND : auctionOrderDto.getOrderType();
+        auctionOrderDto.setOrderCategory(orderType);
+        auctionOrderDto.setOrderType("auction");
+        Result result = baseService.createCerificationOrder(auctionOrderDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 创建拍卖订单
+     * @return
+     */
+//    @ApiOperation(value = "创建拍卖订单" ,notes = "拍卖订单")
+//    @ApiImplicitParam(name="拍卖订单",dataTypeClass = AuctionOrderDto.class)
+//    @ApiResponses({
+//            @ApiResponse(code = 200, message = "返回结果" )
+//    })
+//    @Log(title = "拍卖订单", businessType = BusinessType.INSERT)
+//    @UserLoginToken(faceVerify = false)
+    @PostMapping("/create")
+    @ResponseBody
+    public Result<AuctionOrderDto> createOrder(@RequestBody @Validated AuctionOrderDto auctionOrderDto){
+        log.info(" 请求参数 》》》 {}",auctionOrderDto);
+        //设置默认值
+        String orderType = StringUtils.isEmpty(auctionOrderDto.getOrderType()) ? AuctionConstant.ORDER_TYPE_AUCTION : auctionOrderDto.getOrderType();
+        auctionOrderDto.setOrderCategory(orderType);
+        auctionOrderDto.setOrderType("auction");
+        Result result = baseService.createOrder(auctionOrderDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 查询拍卖订单列表
+     * @return
+     */
+    @ApiOperation(value = "查询拍卖订单列表-后台@(1.0)" ,notes = "拍卖订单")
+    @ApiImplicitParam(name="拍卖订单列表",dataTypeClass = AuctionOrderEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "拍卖订单列表", businessType = BusinessType.SEARCH)
+//    @UserLoginToken(faceVerify = false)
+    @PostMapping("/search")
+    @ResponseBody
+    public Result<AuctionOrderDto> searchOrder(@RequestBody @Validated AuctionOrder auctionOrder){
+        auctionOrder.setOrderType("auction");
+        Result<AuctionOrderDto> orderDtoResult = listPage(auctionOrder,false);
+        if(orderDtoResult.isSuccess() && 0L < orderDtoResult.getTotal() ){
+            List<AuctionOrderDto> dataList = orderDtoResult.getDataList();
+            dataList.forEach(item->{
+                item.setOrderCourierRecordDto(orderCourierRecordService.getByOrderIdAndOrderType(item.getId(),item.getOrderType()));
+            });
+            orderDtoResult = orderDtoResult.page(orderDtoResult.getTotal(), dataList);
+        }
+        return orderDtoResult;
+    }
+
+
+    /**
+     * 查询拍卖订单列表
+     * @return
+     */
+    @ApiOperation(value = "查询拍卖订单列表-移动端@(1.0)" ,notes = "拍卖订单")
+    @ApiImplicitParam(name="拍卖订单列表",dataTypeClass = AuctionOrderEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "拍卖订单列表", businessType = BusinessType.SEARCH)
+    @UserLoginToken(faceVerify = false)
+    @PostMapping("/userOrders")
+    @ResponseBody
+    public Result<AuctionOrderDto> orders(@RequestBody @Validated AuctionOrder auctionOrder){
+        auctionOrder.setOrderType("auction");
+        auctionOrder.setAccountId(getAppUserInfo().getId());
+        Result<AuctionOrderDto> orderDtoResult = listPage(auctionOrder,true);
+        if(orderDtoResult.isSuccess() && 0L < orderDtoResult.getTotal() ){
+            List<AuctionOrderDto> dataList = orderDtoResult.getDataList();
+            dataList.forEach(item->{
+                item.setOrderCourierRecordDto(orderCourierRecordService.getByOrderIdAndOrderType(item.getId(),item.getOrderType()));
+            });
+            orderDtoResult = orderDtoResult.page(orderDtoResult.getTotal(), dataList);
+        }
+        return orderDtoResult;
+    }
+    /**
+     *查询组队列表
+     * @return
+     */
+    @ApiOperation(value = "查询拍卖订单@(1.0)" ,notes = "拍卖订单-id")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "查询拍卖订单", businessType = BusinessType.SEARCH)
+//    @UserLoginToken(faceVerify = false)
+    @GetMapping("/info/{id}")
+    @ResponseBody
+    public Result<AuctionOrderDto> getById(@PathVariable Integer id){
+        Result<AuctionOrderDto> info = info(id);
+        if(info.isSuccess()){
+            AuctionOrderDto data = info.getData();
+            data.setOrderCourierRecordDto(orderCourierRecordService.getByOrderIdAndOrderType(data.getId(),data.getOrderType()));
+            info = info.putDataJSON(data);
+        }
+        return info;
+    }
+    /**
+     *查询组队列表
+     * @return
+     */
+    @ApiOperation(value = "创建支付订单@(1.0)" ,notes = "创建支付订单")
+    @ApiImplicitParam(name="拍卖订单",dataTypeClass = OrderBayInfoEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "创建支付订单", businessType = BusinessType.OTHER)
+    @UserLoginToken
+    @PostMapping("/pay")
+    @ResponseBody
+    public Result<AuctionOrderDto> toPay(@RequestBody @Validated OrderBayInfoEntry orderBayInfoEntry){
+        log.info(" 请求参数 》》》 {}",orderBayInfoEntry);
+        Result result = orderService.pay(orderBayInfoEntry);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 取消订单
+     * @return
+     */
+    @ApiOperation(value = "取消订单-保证金@(1.0)" ,notes = "拍卖订单-id")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "取消订单-保证金", businessType = BusinessType.UPDATE)
+    @UserLoginToken (faceVerify = false)
+        @PostMapping("/cancelCerificationOrder/{id}")
+    @ResponseBody
+    public Result<AuctionOrderDto> cancelCerificationOrder(@PathVariable Integer id){
+        return baseService.cancelCerificationOrder(id);
+    }
+
+    /**
+     *订单退款
+     * @return
+     */
+    @ApiOperation(value = "订单退款[保证金订单]@(1.0)" ,notes = "订单退款[保证金订单]")
+    @ApiImplicitParam(name="保证金订单",dataTypeClass = OrderBayInfoEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "订单退款[保证金订单]", businessType = BusinessType.OTHER)
+    @UserLoginToken
+    @PostMapping("/refundCerificationOrder")
+    @ResponseBody
+    public Result<AuctionOrderDto> refundCerificationOrder(@RequestBody OrderBayInfoEntry orderBayInfoEntry){
+        log.info(" 请求参数 》》》 {}",orderBayInfoEntry);
+        Integer id = orderBayInfoEntry.getId();
+        if(null == id){
+            throw new ServiceException("订单id不能为空!");
+        }
+        Result result = baseService.refundCerificationOrder(orderBayInfoEntry);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     *订单退款
+     * @return
+     */
+    /*@ApiOperation(value = "订单退款[拍卖订单]" ,notes = "订单退款[拍卖订单]")
+    @ApiImplicitParam(name="拍卖订单",dataTypeClass = OrderBayInfoEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "订单退款[拍卖订单]", businessType = BusinessType.OTHER)
+    @UserLoginToken
+    @PostMapping("/refund")
+    @ResponseBody*/
+    public Result<AuctionOrderDto> refund(@RequestBody OrderBayInfoEntry orderBayInfoEntry){
+        log.info(" 请求参数 》》》 {}",orderBayInfoEntry);
+        Integer id = orderBayInfoEntry.getId();
+        if(null == id){
+            throw new ServiceException("订单id不能为空!");
+        }
+        Result result = orderService.refund(orderBayInfoEntry);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+}

+ 54 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderListController.java

@@ -0,0 +1,54 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.AuctionOrderEntry;
+import com.poyee.auctionorder.dto.AuctionOrderListDto;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.auctionorder.service.IAuctionOrderListService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import com.poyee.framework.annotation.UserLoginToken;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 拍卖订单-子表 前端控制器
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/auctionOrderList")
+public class AuctionOrderListController  extends BaseController<IAuctionOrderListService, AuctionOrderList,AuctionOrderListDto> {
+
+
+    /**
+     *查询拍卖订单列表 -
+     * @return
+     */
+//    @ApiOperation(value = "查询拍卖订单列表" ,notes = "拍卖订单")
+    @ApiImplicitParam(name="拍卖订单列表",dataTypeClass = AuctionOrderEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "拍卖订单列表", businessType = BusinessType.SEARCH)
+    @UserLoginToken
+    @PostMapping("/search")
+    @ResponseBody
+    public Result<AuctionOrderListDto> searchOrder(@RequestBody @Validated AuctionOrderList auctionOrder){
+        log.info(" 请求参数 》》》 {}",auctionOrder);
+        Result<AuctionOrderListDto> result = listPage(auctionOrder,true);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+
+}

+ 94 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/AuctionOrderPriController.java

@@ -0,0 +1,94 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.dto.QualifedRuleInfoDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.service.IAuctionOrderService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import com.poyee.util.AuctionConstant;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 拍卖订单-主表 前端控制器
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Slf4j
+@Api("拍卖订单接口")
+@RestController
+@RequestMapping("/p1/api/auctionOrder")
+public class AuctionOrderPriController extends BaseController<IAuctionOrderService, AuctionOrder,AuctionOrderDto> {
+
+    /**
+     * 查询账户保证金及账户保证积分
+     * @return
+     */
+    @ApiOperation(value = "查询账户保证金及账户保证积分@(1.0)" ,notes = "查询账户保证金及账户保证积分")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果:data{point:积分,amount:金额,accountPoint:积分,accountAmount:金额}" )
+    })
+    @Log(title = "查询账户保证金及账户保证积分", businessType = BusinessType.SEARCH)
+    @PostMapping("/searchAccountBond")
+    @ResponseBody
+    public Result searchAccountBond(@RequestBody QualifedRuleInfoDto qualifedRuleInfoDto){
+        log.info(" 请求参数 》》》 {}",qualifedRuleInfoDto);
+        qualifedRuleInfoDto.setOrderType("auction");
+        qualifedRuleInfoDto.setMode(StringUtils.isNotEmpty(qualifedRuleInfoDto.getMode()) ? qualifedRuleInfoDto.getMode().toUpperCase():qualifedRuleInfoDto.getMode());
+        Result result = baseService.searchAccountBond(qualifedRuleInfoDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 验证资格
+     * @return
+     */
+    @ApiOperation(value = "验证资格@(1.0)" ,notes = "验证资格")
+    @ApiImplicitParam(name="拍卖规则信息",dataTypeClass = QualifedRuleInfoDto.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果:data{point:积分,amount:金额}" )
+    })
+    @Log(title = "验证资格", businessType = BusinessType.SEARCH)
+    @PostMapping("/verification")
+    @ResponseBody
+    public Result verification(@RequestBody @Validated QualifedRuleInfoDto qualifedRuleInfoDto){
+        log.info(" 请求参数 》》》 {}",qualifedRuleInfoDto);
+        qualifedRuleInfoDto.setOrderType("auction");
+        Result result = baseService.verification(qualifedRuleInfoDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 创建拍卖订单
+     * @return
+     */
+    @ApiOperation(value = "创建拍卖订单-后台@(1.0)" ,notes = "拍卖订单")
+    @ApiImplicitParam(name="拍卖订单",dataTypeClass = AuctionOrderDto.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "拍卖订单", businessType = BusinessType.INSERT)
+    @PostMapping("/create")
+    @ResponseBody
+    public Result<AuctionOrderDto> createOrder(@RequestBody @Validated AuctionOrderDto auctionOrderDto){
+        log.info(" 请求参数 》》》 {}",auctionOrderDto);
+        //设置默认值
+        String orderType = StringUtils.isEmpty(auctionOrderDto.getOrderType()) ? AuctionConstant.ORDER_TYPE_AUCTION : auctionOrderDto.getOrderType();
+        auctionOrderDto.setOrderCategory(orderType);
+        auctionOrderDto.setOrderType("auction");
+        Result result = baseService.createOrder(auctionOrderDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+
+}

+ 46 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/OrderController.java

@@ -0,0 +1,46 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import com.tzy.sportcard.api.dto.ResourceData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 拍卖订单接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/p1/api/order")
+public class OrderController extends BaseController<OrderService, AuctionOrder, AuctionOrderDto> {
+
+    /**
+     * 支付回调订单
+     * @return
+     */
+    @Log(title = "支付回调订单", businessType = BusinessType.INSERT)
+    @PostMapping("/payCallBackOrder")
+    @ResponseBody
+    public Result payCallBackOrder(@RequestBody ResourceData resourceData){
+        log.info(" 支付回调订单》》{} ",resourceData);
+        return baseService.payBackOrder(resourceData);
+    }
+
+    /**
+     * 钱包消费记录
+     * @return
+     */
+    @Log(title = "钱包消费记录", businessType = BusinessType.INSERT)
+    @PostMapping("/rechargeExpendCallBack")
+    @ResponseBody
+    public Result rechargeExpendCallBack(@RequestBody ResourceData resourceData){
+        log.info(" 钱包消费记录》》{} ",resourceData);
+        return baseService.rechargeExpendCallBack(resourceData);
+    }
+
+}

+ 124 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/RechargeOrderController.java

@@ -0,0 +1,124 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.dto.OrderBaseEntity;
+import com.poyee.auctionorder.dto.RechargeOrderDto;
+import com.poyee.auctionorder.dto.RechargeOrderEntity;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import com.poyee.framework.annotation.UserLoginToken;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 钱包充值提现订单接口
+ */
+@Slf4j
+@Api(value = "钱包充值提现订单", tags = "钱包充值提现订单")
+@RestController
+@RequestMapping("/v1/api/rechargeOrder")
+public class RechargeOrderController extends BaseController<OrderService, AuctionOrder, AuctionOrderDto> {
+
+    /**
+     * 创建充值订单
+     *
+     * @return
+     */
+    @ApiOperation(value = "创建充值/提现订单@(3.0)", notes = "充值订单")
+    @ApiImplicitParam(name = "充值订单", dataTypeClass = RechargeOrderDto.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果")
+    })
+    @Log(title = "充值订单", businessType = BusinessType.INSERT)
+    @UserLoginToken
+    @PostMapping("/recharge")
+    @ResponseBody
+    public Result createToPay(@RequestBody @Validated RechargeOrderDto rechargeOrderDto) {
+        log.info(" 请求参数 》》》 {}", rechargeOrderDto);
+        Result result = baseService.createToRecharge(rechargeOrderDto);
+        log.info(" 返回数据 》》》 {}", result);
+        return result;
+    }
+
+    /**
+     * 查询充值订单列表
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询充值订单列表@(3.0)", notes = "查询充值订单列表")
+    @ApiImplicitParam(name = "充值订单", dataTypeClass = RechargeOrderEntity.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果")
+    })
+    @Log(title = "查询充值订单列表", businessType = BusinessType.SEARCH)
+    @UserLoginToken
+    @PostMapping("/list")
+    @ResponseBody
+    public Result list(@RequestBody OrderBaseEntity orderBaseEntity) {
+        orderBaseEntity.setOrderType("recharge");
+        log.info(" 请求参数 》》》 {}", orderBaseEntity);
+        return baseService.searchRechargeOrders(orderBaseEntity);
+    }
+
+    /**
+     * 查询充值订单
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询充值订单@(3.0)", notes = "充值订单-验证用户")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果")
+    })
+    @ApiImplicitParam()
+    @Log(title = "充值订单", businessType = BusinessType.SEARCH)
+    @UserLoginToken
+    @GetMapping("/info/{id}")
+    @ResponseBody
+    public Result info(@PathVariable Integer id) {
+        log.info(" 请求参数 》》》 {}", id);
+        return baseService.searchOrderById(id, true);
+    }
+
+    /**
+     * 查询充值订单
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询充值订单@(3.0)", notes = "充值订单-非验证用户")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果")
+    })
+    @ApiImplicitParam()
+    @Log(title = "充值订单", businessType = BusinessType.SEARCH)
+//    @UserLoginToken
+    @GetMapping("/detail/{id}")
+    @ResponseBody
+    public Result detail(@PathVariable Integer id) {
+        log.info(" 请求参数 》》》 {}", id);
+        return baseService.searchOrderById(id, false);
+    }
+
+    /**
+     * 查询下次提现时间
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询下次提现时间@(3.0)", notes = "查询下次提现时间")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果")
+    })
+    @Log(title = "查询下次提现时间", businessType = BusinessType.SEARCH)
+    @UserLoginToken
+    @GetMapping("/searchWithdrawalTime")
+    @ResponseBody
+    public Result searchWithdrawalTime() {
+        return baseService.searchWithdrawalTime();
+    }
+
+}

+ 104 - 0
auction-order/src/main/java/com/poyee/auctionorder/controller/VendingMachineOrderController.java

@@ -0,0 +1,104 @@
+package com.poyee.auctionorder.controller;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.dto.OrderRefundInfoEntry;
+import com.poyee.auctionorder.dto.VendingMachineOrderDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.auctionorder.service.VendingMachineOrderService;
+import com.poyee.base.controller.BaseController;
+import com.poyee.base.dto.Result;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import com.poyee.util.RandomUtil;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * 贩卖机订单接口
+ *
+ * @since 2023年3月27日
+ */
+@Slf4j
+@Api("贩卖机订单接口")
+@RestController
+@RequestMapping("/v1/api/vendingMachineOrder")
+public class VendingMachineOrderController extends BaseController<VendingMachineOrderService, AuctionOrder, VendingMachineOrderDto> {
+
+    @Autowired
+    private OrderService orderService;
+    /**
+     * 创建贩卖机订单
+     * @return
+     */
+    @ApiOperation(value = "创建并支付贩卖机订单@(2.0)",notes = "贩卖机订单")
+    @ApiImplicitParam(name="贩卖机订单",dataTypeClass = VendingMachineOrderDto.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "贩卖机订单", businessType = BusinessType.INSERT)
+//    @UserLoginToken(faceVerify = false)
+    @PostMapping("/createToPay")
+    @ResponseBody
+    public Result createToPay(@RequestBody @Validated VendingMachineOrderDto vendingMachineOrderDto){
+        log.info(" 请求参数 》》》 {}",vendingMachineOrderDto);
+        //设置默认值
+        vendingMachineOrderDto.setOrderType("vending");
+        vendingMachineOrderDto.setOrderNo(RandomUtil.getRandom(RandomUtil.VENDING_MACHINE));
+        AuctionOrderDto auctionOrderDto = new AuctionOrderDto();
+        try {
+            BeanUtils.copyProperties(auctionOrderDto,vendingMachineOrderDto);
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        Result result = orderService.createToPay(auctionOrderDto);
+//        Result result = baseService.createToPay(vendingMachineOrderDto);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+    /**
+     * 查询贩卖机订单
+     * @return
+     */
+    @ApiOperation(value = "查询贩卖机订单@(2.0)",notes = "贩卖机订单")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "贩卖机订单", businessType = BusinessType.SEARCH)
+//    @UserLoginToken(faceVerify = false)
+    @GetMapping("/info/{id}")
+    @ResponseBody
+    public Result createToPay(@PathVariable Integer id){
+        log.info(" 请求参数 》》》 {}",id);
+        return baseService.getById(id);
+    }
+
+
+    /**
+     * 贩卖机订单退款
+     * @return
+     */
+    @ApiOperation(value = "贩卖机订单退款@(2.0)",notes = "贩卖机订单退款")
+    @ApiImplicitParam(name="贩卖机订单退款",dataTypeClass = OrderRefundInfoEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "贩卖机订单退款", businessType = BusinessType.INSERT)
+//    @UserLoginToken(faceVerify = false)
+    @PostMapping("/refund")
+    @ResponseBody
+    public Result refund(@RequestBody @Validated OrderRefundInfoEntry orderRefundInfoEntry){
+        log.info(" 请求参数 》》》 {}",orderRefundInfoEntry);
+        return baseService.refund(orderRefundInfoEntry);
+    }
+
+
+}

+ 179 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderDto.java

@@ -0,0 +1,179 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.courier.dto.OrderCourierRecordDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 入参
+ */
+@Data
+@TableName("auction_order")
+@ApiModel( description = "拍卖/保证金订单")
+public class AuctionOrderDto extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(hidden = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "设备id",hidden = true)
+    @TableField("shop_code")
+    private String shopCode;
+
+    @ApiModelProperty("店铺id")
+    @TableField("merchant_id")
+    @NotNull(message = "店铺id不能为空")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+//    @NotNull(message = "用户id不能为空")
+    private Integer accountId;
+
+    @ApiModelProperty(value = "用户账号",hidden = true)
+    @TableField("user_account")
+//    @NotBlank(message = "用户账号不能为空")
+    private String account;
+
+    @ApiModelProperty(value = "订单类型: auction=拍卖订单,vending=贩卖机,recharge=钱包",hidden = true )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别: BOND=保证金订单,AUCTION=竞拍订单,BARGAIN=议价订单" )
+    @TableField("order_category")
+    @NotNull(message = "订单类别不能为空")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "保证金类型: ACCOUNT=账户保证金,LOT=单品保证金,AUCTION=专场保证金")
+    @TableField("mode")
+    private String mode;
+
+    @ApiModelProperty(value = "订单编码",hidden = true)
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value = "商品/拍卖id",hidden = true)
+    @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+    @ApiModelProperty(value = "商品/拍卖编码",hidden = true)
+    @TableField("auction_code")
+    private String auctionCode;
+
+    @ApiModelProperty(value = "商品/拍卖名称" ,hidden = true)
+    @TableField("auction_name")
+    private String auctionName;
+
+    @ApiModelProperty(value = "拍卖类型:单品,拍卖会")
+    @TableField("auction_type")
+    @NotBlank(message = "拍卖类型不能为空")
+    private String auctionType;
+
+    @ApiModelProperty(value = "支付类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT,无需保证金FREE" )
+    @TableField("pay_category")
+    @NotBlank(message = "支付类别不能为空")
+    private String payCategory;
+
+    @ApiModelProperty(value = "支付类型:aggregate=聚合支付(二维码扫码支付)",hidden = true)
+    @TableField("payment_type")
+    private String paymentType;
+
+    @ApiModelProperty("积分:支付类别为POINT或PAMOUNT时不能为空")
+    @TableField("point")
+    private Integer point;
+
+    @ApiModelProperty("数量:如果是保证金 则默认为:1")
+    @TableField("purchase_count")
+    @NotNull(message = "数量不能为空")
+    private Integer num;
+
+    @ApiModelProperty("总金额:支付类别为AMOUNT或PAMOUNT时不能为空")
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("实际支付金额:支付类别为AMOUNT或PAMOUNT时不能为空")
+    @TableField("actual_payable")
+    private BigDecimal actualPayable;
+
+    @ApiModelProperty("运费")
+    @TableField("freight_amount")
+    private BigDecimal freightAmount;
+
+    @ApiModelProperty("优惠券id")
+    @TableField("coupon")
+    private Integer coupon;
+
+    @ApiModelProperty("优惠金额")
+    @TableField("discount")
+    private BigDecimal discount;
+
+    @ApiModelProperty("付款期限")
+    @TableField("pay_time_limit")
+    private Date payTimeLimit;
+
+    @ApiModelProperty("状态")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("说明")
+    @TableField("msg")
+    private String msg;
+
+    @ApiModelProperty("扩展字段1")
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty("扩展字段2")
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty("扩展字段3")
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty("扩展字段4")
+    @TableField("prop4")
+    private String prop4;
+
+    @ApiModelProperty(value = "创建时间",hidden = true)
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人",hidden = true)
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "更新人",hidden = true)
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("拍品信息")
+    @TableField(exist = false)
+    private List<AuctionOrderList> goods;
+
+    @ApiModelProperty("订单快递信息")
+    private OrderCourierRecordDto orderCourierRecordDto;
+
+}

+ 41 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderEntry.java

@@ -0,0 +1,41 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("auction_order")
+@ApiModel( description = "查询订单列表参数")
+public class AuctionOrderEntry extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "订单编码")
+    private String orderNo;
+
+    @ApiModelProperty(value = "商品名称" )
+    private String auctionName;
+
+    @ApiModelProperty(value = "订单类型: auction=拍卖订单,vending=贩卖机",hidden = true )
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别: BOND=保证金订单,AUCTION=竞拍订单,BARGAIN=议价订单" )
+    private String orderCategory;
+//    @ApiModelProperty("商品编码")
+//    private String goodsCode;
+
+    @ApiModelProperty(value = "支付类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT,无需保证金FREE")
+    private String payCategory;
+
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+
+    @ApiModelProperty("支付状态")
+    private String paymentStatus;
+
+    private Integer userId;
+
+}

+ 113 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/AuctionOrderListDto.java

@@ -0,0 +1,113 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 拍卖订单-子表
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Getter
+@Setter
+@TableName("auction_order_list")
+@ApiModel(description = "拍卖订单-拍品信息")
+public class AuctionOrderListDto extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(hidden = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "订单id",hidden = true)
+    @TableField("order_id")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "订单编码",hidden = true)
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value = "商家id",hidden = true)
+    @TableField("merchant_id")
+    private Integer merchantId;
+
+    @ApiModelProperty(value = "拍卖id",hidden = true)
+    @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+    @ApiModelProperty(value = "用户id",hidden = true)
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "商品id" ,readOnly = true)
+    @TableField("goods_id")
+    private String goodsId;
+
+      @ApiModelProperty("商品编码")
+      @TableField("goods_code")
+    private String goodsCode;
+
+    @ApiModelProperty(value = "商品名称" ,readOnly = true)
+    @TableField("goods_name")
+    private String name;
+//    private String goodsName;
+
+    @ApiModelProperty(value = "数量" ,readOnly = true)
+    @TableField("num")
+    private Integer num;
+
+    @ApiModelProperty(value = "图片" ,readOnly = true)
+    @TableField("imgs")
+    private String imgs;
+
+    @ApiModelProperty(value = "单价" ,readOnly = true)
+    @TableField("unint_price")
+    private BigDecimal amount;
+//    private BigDecimal unintPrice;
+
+    @ApiModelProperty(value = "总价" ,readOnly = true)
+    @TableField("total_price")
+    private BigDecimal totalAmount;
+//    private BigDecimal totalPrice;
+
+    @ApiModelProperty(value = "佣金" ,readOnly = true)
+    @TableField("commission")
+    private BigDecimal commissionAmount;
+//    private BigDecimal commission;
+
+    @ApiModelProperty(value = "备注" ,readOnly = true)
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty(value = "扩展字段1" ,readOnly = true)
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty(value = "扩展字段2" ,readOnly = true)
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty(value = "扩展字段3" ,readOnly = true)
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty(value = "扩展字段4" ,readOnly = true)
+    @TableField("prop4")
+    private String prop4;
+
+
+}

+ 167 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/CerificationOrderDto.java

@@ -0,0 +1,167 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 入参
+ */
+@Data
+@TableName("auction_order")
+@ApiModel( description = "保证金订单")
+public class CerificationOrderDto extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(hidden = true)
+    private Integer id;
+
+    @ApiModelProperty("店铺id")
+    @TableField("merchant_id")
+    @NotNull(message = "店铺id不能为空")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+//    @NotNull(message = "用户id不能为空")
+    private Integer accountId;
+
+    @ApiModelProperty(value = "用户账号",hidden = true)
+    @TableField("user_account")
+//    @NotBlank(message = "用户账号不能为空")
+    private String account;
+
+    @ApiModelProperty(value = "订单类型: auction=拍卖订单,vending=贩卖机",hidden = true )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别: BOND=保证金订单(默认),AUCTION=竞拍订单,BARGAIN=议价订单" )
+    @TableField("order_category")
+    @NotNull(message = "订单类别不能为空")
+    private String orderCategory="BOND";
+
+    @ApiModelProperty(value = "保证金类型: ACCOUNT=账户保证金,LOT=单品保证金,AUCTION=专场保证金")
+    @TableField("mode")
+    private String mode;
+
+    @ApiModelProperty(value = "订单编码",hidden = true)
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value = "商品/拍卖id",hidden = true)
+    @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+    @ApiModelProperty(value = "商品/拍卖编码",hidden = true)
+    @TableField("auction_code")
+    private String auctionCode;
+
+    @ApiModelProperty(value = "商品/拍卖名称" ,hidden = true)
+    @TableField("auction_name")
+    private String auctionName;
+
+    @ApiModelProperty(value = "拍卖类型:单品,拍卖会")
+    @TableField("auction_type")
+    @NotBlank(message = "拍卖类型不能为空")
+    private String auctionType;
+
+    @ApiModelProperty(value = "支付类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT" )
+    @TableField("pay_category")
+    @NotBlank(message = "支付类别不能为空")
+    private String payCategory;
+
+    @ApiModelProperty("积分:支付类别为POINT,PAMOUNT,POINTORAMOUNT时不能为空")
+    @TableField("point")
+    private Integer point;
+
+    @ApiModelProperty("数量:如果是保证金 则默认为:1")
+    @TableField("purchase_count")
+    @NotNull(message = "数量不能为空")
+    private Integer num;
+
+    @ApiModelProperty("总金额:支付类别为AMOUNT,PAMOUNT,POINTORAMOUNT时不能为空")
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("实际支付金额:支付类别为AMOUNT,PAMOUNT,POINTORAMOUNT时不能为空")
+    @TableField("actual_payable")
+    private BigDecimal actualPayable;
+
+    @ApiModelProperty("运费")
+    @TableField("freight_amount")
+    private BigDecimal freightAmount;
+
+    @ApiModelProperty("优惠券id")
+    @TableField("coupon")
+    private Integer coupon;
+
+    @ApiModelProperty("优惠金额")
+    @TableField("discount")
+    private BigDecimal discount;
+
+    @ApiModelProperty("付款期限")
+    @TableField("pay_time_limit")
+    private Date payTimeLimit;
+
+    @ApiModelProperty("状态")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("说明")
+    @TableField("msg")
+    private String msg;
+
+    @ApiModelProperty("扩展字段1")
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty("扩展字段2")
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty("扩展字段3")
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty("扩展字段4")
+    @TableField("prop4")
+    private String prop4;
+
+    @ApiModelProperty(value = "创建时间",hidden = true)
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人",hidden = true)
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "更新人",hidden = true)
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty(value = "拍品信息",hidden = true)
+    @TableField(exist = false)
+    private List<AuctionOrderList> goods;
+
+}

+ 53 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/OrderBaseEntity.java

@@ -0,0 +1,53 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 订单参数
+ */
+@Data
+public class OrderBaseEntity extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "订单类型:recharge=充值" )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别:recharge=充值,withdraw=提现")
+    @TableField("order_category")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "账户类型:person=个人,merchant=商家")
+    private String accountType;
+
+    @ApiModelProperty(value = "订单编码")
+    private String orderNo;
+
+    @ApiModelProperty(value = "状态",
+            name="订单状态\n" +
+            "100 待支付\n" +
+            "101 已支付\n" +
+            "103 待发货\n" +
+            "104 已发货\n" +
+            "1040 快递下单中\n" +
+            "1041 待打印面单\n" +
+            "1042 已打印面单\n" +
+            "1043 快递单已取消\n" +
+            "105 运货中\n" +
+            "106 待收货\n" +
+            "201 订单超时 取消\n" +
+            "202 用户取消\n" +
+            "203 支付失败\n" +
+            "204 退款中\n" +
+            "205 退款完成\n" +
+            "206 退款失败\n" +
+            "301 订单完成\n" +
+            "302 订单结束\n" +
+            "303 订单已关闭")
+    private Integer status;
+
+}

+ 78 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/OrderBayInfoEntry.java

@@ -0,0 +1,78 @@
+package com.poyee.auctionorder.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 支付请求参数
+ */
+@Data
+@ToString
+@ApiModel(description = "支付请求参数")
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderBayInfoEntry implements Serializable {
+
+    public OrderBayInfoEntry(Integer id,String payType,String category){
+        this.id = id;
+        this.payType = payType;
+        this.category = category;
+    }
+
+    //订单id
+    @NotNull(message = "订单id不能为空")
+    @ApiModelProperty(value = "订单id")
+    private Integer id;
+
+    //支付方式
+    @NotBlank(message = "支付方式不能为空")
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    //订单过期时间
+//    @NotNull(message = "订单过期时间不能为空")
+    @ApiModelProperty(value = "订单过期时间" ,hidden = true)
+    private Date expireTime ;
+
+    @ApiModelProperty("收货地址id")
+    private Integer addressId;
+
+    @ApiModelProperty("优惠券id")
+    private Integer coupon;
+
+    @ApiModelProperty("银行卡id")
+    private Integer bankId;
+
+    @ApiModelProperty("平台")
+    private String type;
+
+    //退款金额
+    @ApiModelProperty(value = "退款金额")
+    private String refundFee;
+    //退款类型:快递费,订单金额,快递+金额
+    @ApiModelProperty(value = "退款类型:freight=快递费,order=订单金额,all=全部")
+    private String refundType;
+    //退款描述
+    @ApiModelProperty(value = "退款描述")
+    private String refundMsg;
+
+    @ApiModelProperty(value = "支付模块 : 拍卖auction,贩卖机=vending,recharge=钱包",hidden = true)
+    private String category;
+
+    @ApiModelProperty(value = "订单类别:recharge=充值,withdraw=提现")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "账户类型:person=个人,merchant=商家")
+    private String accountType;
+
+
+}

+ 35 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/OrderRefundInfoEntry.java

@@ -0,0 +1,35 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+@Data
+@ApiModel( description = "贩卖机订单")
+public class OrderRefundInfoEntry  {
+
+    /*@ApiModelProperty("订单id")
+    @NotNull(message = "订单id不能为空")
+    private Integer id;*/
+
+    @ApiModelProperty("订单编码")
+    @NotBlank(message = "订单编码不能为空")
+    private String orderNo;
+
+    @ApiModelProperty("退款描述")
+    @NotBlank(message = "退款描述不能为空")
+    private String refundMsg;
+
+    @ApiModelProperty(value = "订单类型",hidden = true)
+    private String orderType;
+
+    @ApiModelProperty("商品信息")
+    @TableField(exist = false)
+    private List<AuctionOrderList> goods;
+
+}

+ 65 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/QualifedRuleInfoDto.java

@@ -0,0 +1,65 @@
+package com.poyee.auctionorder.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import static com.poyee.util.AuctionConstant.*;
+
+/**
+ * 规则信息
+ */
+@Data
+@ToString
+public class QualifedRuleInfoDto implements Serializable {
+    //用户ID
+    @ApiModelProperty(value = "用户id")
+    private String accountId;
+    //ACCOUNT:账户保证金;Lot:单品保证金;Auction:专场保证金
+    @ApiModelProperty(value = "保证金类型:ACCOUNT:账户保证金;LOT:单品保证金;AUCTION:专场保证金")
+    @NotBlank(message = "保证金类型不能为空")
+    private String mode;
+
+    @ApiModelProperty(value = "订单类型",hidden = true)
+    private String orderType;
+    @ApiModelProperty(value = "拍卖类型:单品,拍卖会")
+//    @NotBlank(message = "拍卖类型不能为空")
+    private String auctionType;
+    //商品/拍卖id
+    @ApiModelProperty(value = "商品/拍卖id")
+//    @NotNull(message = "商品/拍卖id不能为空")
+    private String eventId;
+
+    //商品id: 如果是拍卖会时 对单品进行验证资格
+    @ApiModelProperty(value = "商品id:如果是拍卖会时传值" ,hidden = true)
+//    @NotBlank(message = "商品id不能为空")
+    @Deprecated
+    private String gooodsId;
+    @ApiModelProperty(value = "类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT,无需保证金FREE" )
+    @NotBlank(message = "类别不能为空")
+    private String category;
+    //保证金额
+    @ApiModelProperty(value = "保证金额")
+    private BigDecimal amount;
+    //保证积分
+    @ApiModelProperty(value = "保证积分")
+    private Integer point;
+
+    public boolean checkNullCategory(){
+        if(CATEGORY_POINT.equals(category) && null != point ){
+            return true;
+        }else if(CATEGORY_AMOUNT.equals(category) && null != amount ){
+            return true;
+        }else if(CATEGORY_PAMOUNT.equals(category) && null != amount && null != point ){
+            return true;
+        }else if(CATEGORY_POINTORAMOUNT.equals(category) && (null != amount || null != point) ){
+            return true;
+        }
+        return  false;
+    }
+
+}

+ 56 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/QualifedRuleInfoEntity.java

@@ -0,0 +1,56 @@
+package com.poyee.auctionorder.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import static com.poyee.util.AuctionConstant.*;
+
+/**
+ * 规则信息
+ */
+@Data
+@ToString
+public class QualifedRuleInfoEntity implements Serializable {
+    //用户ID
+    @ApiModelProperty(value = "用户id")
+    private String accountId;
+    //ACCOUNT:账户保证金;Lot:单品保证金;Auction:专场保证金
+    @ApiModelProperty(value = "保证金类型:ACCOUNT:账户保证金;LOT:单品保证金;AUCTION:专场保证金")
+    private String mode;
+    @ApiModelProperty(value = "拍卖类型:单品,拍卖会")
+    private String auctionType;
+    //商品/拍卖id
+    @ApiModelProperty(value = "商品/拍卖id")
+    private String eventId;
+
+    //商品id: 如果是拍卖会时 对单品进行验证资格
+    @ApiModelProperty(value = "商品id:如果是拍卖会时传值" ,hidden = true)
+    @Deprecated
+    private String gooodsId;
+    @ApiModelProperty(value = "类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT,无需保证金FREE" )
+    private String category;
+    //保证金额
+    @ApiModelProperty(value = "保证金额")
+    private BigDecimal amount;
+    //保证积分
+    @ApiModelProperty(value = "保证积分")
+    private Integer point;
+
+    public boolean checkNullCategory(){
+        if(CATEGORY_POINT.equals(category) && null != point ){
+            return true;
+        }else if(CATEGORY_AMOUNT.equals(category) && null != amount ){
+            return true;
+        }else if(CATEGORY_PAMOUNT.equals(category) && null != amount && null != point ){
+            return true;
+        }else if(CATEGORY_POINTORAMOUNT.equals(category) && (null != amount || null != point) ){
+            return true;
+        }
+        return  false;
+    }
+
+}

+ 167 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/RechargeOrderDto.java

@@ -0,0 +1,167 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 入参
+ */
+@Data
+@TableName("auction_order")
+@ApiModel( description = "充值订单")
+public class RechargeOrderDto extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(hidden = true)
+    private Integer id;
+
+    @ApiModelProperty("银行卡id")
+    @NotNull(message = "银行卡id不能为空!")
+    @TableField(exist = false)
+    private Integer bankId;
+
+    @ApiModelProperty(value = "订单类型:recharge=钱包" )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "充值平台:baofoo" )
+    @TableField(exist = false)
+    @NotBlank(message = "充值类型不能为空!")
+    private String type;
+
+    @ApiModelProperty(value = "账户类型:person=个人,merchant=商家" )
+    @TableField(exist = false)
+    @NotBlank(message = "账户类型不能为空!")
+    private String accountType;
+
+    @ApiModelProperty(value = "支付类型:recharge")
+    @TableField("payment_type")
+    @NotBlank(message = "支付类型不能为空!")
+    private String payWay;
+
+    @ApiModelProperty(value = "订单类别:recharge=充值,withdraw=提现")
+    @TableField("order_category")
+    @NotBlank(message = "订单类别不能为空!")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "支付类别:金额AMOUNT" )
+    @TableField("pay_category")
+    @NotBlank(message = "支付类别不能为空!")
+    private String payCategory;
+
+    @ApiModelProperty("数量:默认1")
+    @TableField("purchase_count")
+    private Integer num;
+
+    @ApiModelProperty("总金额:支付类别为AMOUNT时不能为空")
+    @NotNull(message = "总金额不能为空")
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("说明")
+    @TableField("msg")
+    private String msg;
+
+    @ApiModelProperty("扩展字段1")
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty("扩展字段2")
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty("扩展字段3")
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty("扩展字段4")
+    @TableField("prop4")
+    private String prop4;
+
+    @ApiModelProperty(value = "优惠券id",hidden = true)
+    @TableField("coupon")
+    private Integer coupon;
+
+    @ApiModelProperty(value = "优惠金额",hidden = true)
+    @TableField("discount")
+    private BigDecimal discount;
+
+    @ApiModelProperty("付款期限")
+    @TableField("pay_time_limit")
+    private Date payTimeLimit;
+
+    /**
+     * 订单状态
+     * 100 待支付
+     * 101 已支付
+     * 103 待发货
+     * 104 已发货
+     * 1040 快递下单中
+     * 1041 待打印面单
+     * 1042 已打印面单
+     * 1043 快递单已取消
+     * 105 运货中
+     * 106 待收货
+     * 201 订单超时 取消
+     * 202 用户取消
+     * 203 支付失败
+     * 204 退款中
+     * 205 退款完成
+     * 206 退款失败
+     * 301 订单完成
+     * 302 订单结束
+     * 303 订单已关闭
+     */
+    @ApiModelProperty(value = "状态:",notes="订单状态\n" +
+            "100 待支付\n" +
+            "101 已支付\n" +
+            "103 待发货\n" +
+            "104 已发货\n" +
+            "1040 快递下单中\n" +
+            "1041 待打印面单\n" +
+            "1042 已打印面单\n" +
+            "1043 快递单已取消\n" +
+            "105 运货中\n" +
+            "106 待收货\n" +
+            "201 订单超时\n" +
+            "202 用户取消\n" +
+            "203 支付失败\n" +
+            "204 退款中\n" +
+            "205 退款完成\n" +
+            "206 退款失败\n" +
+            "301 订单完成\n" +
+            "302 订单结束\n" +
+            "303 订单已关闭",hidden = true
+    )
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "创建时间",hidden = true)
+    @TableField(value = "create_time",fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人",hidden = true)
+    @TableField(value = "create_by",fill = FieldFill.INSERT)
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "更新人",hidden = true)
+    @TableField(value = "update_by",fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+}

+ 53 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/RechargeOrderEntity.java

@@ -0,0 +1,53 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 钱包参数
+ */
+@Data
+public class RechargeOrderEntity implements Serializable {
+
+    @ApiModelProperty(value = "订单类型:recharge=充值" )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别:recharge=充值,withdraw=提现")
+    @TableField("order_category")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "账户类型:person=个人,merchant=商家")
+    private String accountType;
+
+    @ApiModelProperty(value = "订单编码")
+    private String orderNo;
+
+    @ApiModelProperty(value = "状态",
+            name="订单状态\n" +
+                    "100 待支付\n" +
+                    "101 已支付\n" +
+                    "103 待发货\n" +
+                    "104 已发货\n" +
+                    "1040 快递下单中\n" +
+                    "1041 待打印面单\n" +
+                    "1042 已打印面单\n" +
+                    "1043 快递单已取消\n" +
+                    "105 运货中\n" +
+                    "106 待收货\n" +
+                    "201 订单超时 取消\n" +
+                    "202 用户取消\n" +
+                    "203 支付失败\n" +
+                    "204 退款中\n" +
+                    "205 退款完成\n" +
+                    "206 退款失败\n" +
+                    "301 订单完成\n" +
+                    "302 订单结束\n" +
+                    "303 订单已关闭"
+    )
+    private Integer status;
+
+}

+ 27 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/UserAuctionOrderEntry.java

@@ -0,0 +1,27 @@
+package com.poyee.auctionorder.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class UserAuctionOrderEntry implements Serializable {
+
+    //拍卖会id
+    private String auctionId;
+    //拍品ID
+    private String id;
+    //拍品名称
+    private String name;
+    //拍卖类型:单品,拍卖会
+    private String depositMode;
+    //积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT
+    private String depositCategory;
+    //保证积分
+    private Integer depositPoint;
+    //保证金金额
+    private BigDecimal depositAmount;
+
+
+}

+ 202 - 0
auction-order/src/main/java/com/poyee/auctionorder/dto/VendingMachineOrderDto.java

@@ -0,0 +1,202 @@
+package com.poyee.auctionorder.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.courier.dto.OrderCourierRecordDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 入参
+ */
+@Data
+@TableName("auction_order")
+@ApiModel( description = "贩卖机订单")
+public class VendingMachineOrderDto extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(hidden = true)
+    private Integer id;
+
+    @ApiModelProperty("店铺id")
+    @TableField("merchant_id")
+    private Integer shopId;
+
+    @ApiModelProperty("设备id")
+    @NotBlank(message = "设备id不能为空")
+    @TableField("shop_code")
+    private String shopCode;
+
+    @ApiModelProperty(value = "用户id",hidden = true)
+    @TableField("user_id")
+    private Integer accountId;
+
+    @ApiModelProperty(value = "用户账号",hidden = true)
+    @TableField("user_account")
+    private String account;
+
+    @ApiModelProperty(value = "订单类型: auction=拍卖订单,vending=贩卖机",hidden = true )
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单编码",hidden = true)
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value = "商品/拍卖id",hidden = true)
+    @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+    @ApiModelProperty(value = "商品编码",hidden = true)
+    @TableField("auction_code")
+    private String auctionCode;
+
+    @ApiModelProperty(value = "商品名称" ,hidden = true)
+    @TableField("auction_name")
+    private String auctionName;
+
+    @ApiModelProperty(value = "支付类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT" )
+    @TableField("pay_category")
+    @NotBlank(message = "支付类别不能为空")
+    private String payCategory;
+
+    @ApiModelProperty("积分:支付类别为POINT或PAMOUNT时不能为空")
+    @TableField("point")
+    private Integer point;
+
+    @ApiModelProperty("数量:如果是保证金 则默认为:1")
+    @TableField("purchase_count")
+    @NotNull(message = "数量不能为空")
+    private Integer num;
+
+    @ApiModelProperty("总金额:支付类别为AMOUNT或PAMOUNT时不能为空")
+    @NotNull(message = "总金额不能为空")
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("实际支付金额:支付类别为AMOUNT或PAMOUNT时不能为空")
+    @TableField("actual_payable")
+    private BigDecimal actualPayable;
+
+    @ApiModelProperty("优惠券id")
+    @TableField("coupon")
+    private Integer coupon;
+
+    @ApiModelProperty("优惠金额")
+    @TableField("discount")
+    private BigDecimal discount;
+
+    @ApiModelProperty("付款期限")
+    @TableField("pay_time_limit")
+    private Date payTimeLimit;
+
+    @ApiModelProperty(value = "支付类型:aggregate=聚合支付(二维码扫码支付)")
+    @NotBlank(message = "支付类型不能为空")
+    @TableField("payment_type")
+    private String paymentType;
+    /**
+     * 订单状态
+     * 100 待支付
+     * 101 已支付
+     * 103 待发货
+     * 104 已发货
+     * 1040 快递下单中
+     * 1041 待打印面单
+     * 1042 已打印面单
+     * 1043 快递单已取消
+     * 105 运货中
+     * 106 待收货
+     * 201 订单超时 取消
+     * 202 用户取消
+     * 203 支付失败
+     * 204 退款中
+     * 205 退款完成
+     * 206 退款失败
+     * 301 订单完成
+     * 302 订单结束
+     * 303 订单已关闭
+     */
+    @ApiModelProperty(value = "状态:",notes="订单状态\n" +
+            "100 待支付\n" +
+            "101 已支付\n" +
+            "103 待发货\n" +
+            "104 已发货\n" +
+            "1040 快递下单中\n" +
+            "1041 待打印面单\n" +
+            "1042 已打印面单\n" +
+            "1043 快递单已取消\n" +
+            "105 运货中\n" +
+            "106 待收货\n" +
+            "201 订单超时\n" +
+            "202 用户取消\n" +
+            "203 支付失败\n" +
+            "204 退款中\n" +
+            "205 退款完成\n" +
+            "206 退款失败\n" +
+            "301 订单完成\n" +
+            "302 订单结束\n" +
+            "303 订单已关闭"
+    )
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("说明")
+    @TableField("msg")
+    private String msg;
+
+    @ApiModelProperty("扩展字段1")
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty("扩展字段2")
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty("扩展字段3")
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty("扩展字段4")
+    @TableField("prop4")
+    private String prop4;
+
+    @ApiModelProperty(value = "创建时间",hidden = true)
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人",hidden = true)
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "更新人",hidden = true)
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("商品信息")
+    @TableField(exist = false)
+    private List<AuctionOrderList> goods;
+
+    @ApiModelProperty("订单快递信息")
+    private OrderCourierRecordDto orderCourierRecordDto;
+
+}

+ 252 - 0
auction-order/src/main/java/com/poyee/auctionorder/entity/AuctionOrder.java

@@ -0,0 +1,252 @@
+package com.poyee.auctionorder.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 拍卖订单-主表
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Data
+@TableName("auction_order")
+@ApiModel(description = "拍卖订单")
+public class AuctionOrder extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "订单id", readOnly = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "商家id", readOnly = true)
+    @TableField("merchant_id")
+    private Integer shopId;
+//    private Integer merchantId;
+
+    @ApiModelProperty(value = "设备id", hidden = true)
+    @TableField("shop_code")
+    private String shopCode;
+
+    @ApiModelProperty(value = "用户id", hidden = true)
+    @TableField("user_id")
+    private Integer accountId;
+//    private Integer userId;
+
+    @ApiModelProperty("用户账号")
+    @TableField("user_account")
+    private String account;
+//    private String userAccount;
+
+    @ApiModelProperty(value = "订单类型: auction=拍卖订单,vending=贩卖机", hidden = true)
+    @TableField("order_type")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单类别: BOND=保证金订单,AUCTION=竞拍订单,BARGAIN=议价订单", readOnly = true)
+    @TableField("order_category")
+    private String orderCategory;
+
+    @ApiModelProperty(value = "保证金类型: ACCOUNT=账户保证金,LOT=单品保证金,AUCTION=专场保证金", readOnly = true)
+    @TableField("mode")
+    private String mode;
+
+    @ApiModelProperty(value = "订单编码", readOnly = true)
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty("商品/拍卖id")
+    @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+    @ApiModelProperty("商品/拍卖编码")
+    @TableField("auction_code")
+    private String auctionCode;
+
+    @ApiModelProperty(value = "商品/拍卖名称", readOnly = true)
+    @TableField("auction_name")
+    private String auctionName;
+
+    @ApiModelProperty(value = "拍卖类型:单品,拍卖会", readOnly = true)
+    @TableField("auction_type")
+    private String auctionType;
+    // CARD-卡
+    //BALANCE-余额
+    @ApiModelProperty(value = "支付类别:积分POINT,金额AMOUNT,积分+金额:PAMOUNT,积分或金额:POINTORAMOUNT,无需保证金FREE,CARD-卡,BALANCE-余额", readOnly = true)
+    @TableField("pay_category")
+    private String payCategory;
+
+    @ApiModelProperty(value = "积分", readOnly = true)
+    @TableField("point")
+    private Integer point;
+
+    @ApiModelProperty(value = "数量", readOnly = true)
+    @TableField("purchase_count")
+    private Integer num;
+//    private Integer purchaseCount;
+
+    @ApiModelProperty(value = "总金额", readOnly = true)
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("实际支付金额")
+    @TableField("actual_payable")
+    private BigDecimal actualPayable;
+
+    @ApiModelProperty(value = "运费", readOnly = true)
+    @TableField("freight_amount")
+    private BigDecimal freightAmount;
+
+    @ApiModelProperty(value = "优惠券", hidden = true)
+    @TableField("coupon")
+    private Integer coupon;
+
+    @ApiModelProperty(value = "优惠金额", readOnly = true)
+    @TableField("discount")
+    private BigDecimal discount;
+
+    @ApiModelProperty(value = "付款期限", readOnly = true)
+    @TableField("pay_time_limit")
+    private Date payTimeLimit;
+    /**
+     * 订单状态
+     * 100 待支付
+     * 101 已支付
+     * 103 待发货
+     * 104 已发货
+     * 1040 快递下单中
+     * 1041 待打印面单
+     * 1042 已打印面单
+     * 1043 快递单已取消
+     * 105 运货中
+     * 106 待收货
+     * 201 订单超时 取消
+     * 202 用户取消
+     * 203 支付失败
+     * 204 退款中
+     * 205 退款完成
+     * 206 退款失败
+     * 301 订单完成
+     * 302 订单结束
+     * 303 订单已关闭
+     */
+    @ApiModelProperty(value = "状态", readOnly = true)
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "删除标记:0=正常", hidden = true)
+    @TableField("del_flg")
+    @TableLogic
+    private Integer delFlg;
+
+    @ApiModelProperty(value = "支付类型", readOnly = true)
+    @TableField("payment_type")
+    private String paymentType;
+
+    @ApiModelProperty(value = "支付通道", hidden = true)
+    @TableField("payment_sub_type")
+    private String paymentSubType;
+
+    @ApiModelProperty(value = "支付编码", hidden = true)
+    @TableField("trade_no")
+    private String tradeNo;
+
+    @ApiModelProperty(value = "支付参数", hidden = true)
+    @TableField("pay_data")
+    private String payData;
+
+    @ApiModelProperty("支付状态")
+    @TableField("payment_status")
+    private String paymentStatus;
+
+    @ApiModelProperty("支付流水号")
+    @TableField("payment_num")
+    private String paymentNum;
+
+    @ApiModelProperty("支付时间")
+    @TableField("payment_time")
+    private Date paymentTime;
+
+    @ApiModelProperty("支付成功时间")
+    @TableField("payment_success_time")
+    private Date paymentSuccessTime;
+
+    @ApiModelProperty(value = "支付返回数据", hidden = true)
+    @TableField("payment_msg")
+    private String paymentMsg;
+
+    @ApiModelProperty(value = "退款编码", hidden = true)
+    @TableField("refund_no")
+    private String refundNo;
+
+    @ApiModelProperty(value = "退款金额", hidden = true)
+    @TableField("refund_fee")
+    private BigDecimal refundFee;
+
+    @ApiModelProperty(value = "退款状态", hidden = true)
+    @TableField("refund_status")
+    private String refundStatus;
+
+    @ApiModelProperty(value = "退款时间", hidden = true)
+    @TableField("refund_time")
+    private Date refundTime;
+
+    @ApiModelProperty(value = "退款成功时间", hidden = true)
+    @TableField("refund_success_time")
+    private Date refundSuccessTime;
+
+    @ApiModelProperty(value = "退款返回数据", hidden = true)
+    @TableField("refund_msg")
+    private String refundMsg;
+
+    @ApiModelProperty(value = "备注", readOnly = true)
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("说明")
+    @TableField("msg")
+    private String msg;
+
+    @ApiModelProperty("扩展字段1")
+    @TableField("prop1")
+    private String prop1;
+
+    @ApiModelProperty("扩展字段2")
+    @TableField("prop2")
+    private String prop2;
+
+    @ApiModelProperty("扩展字段3")
+    @TableField("prop3")
+    private String prop3;
+
+    @ApiModelProperty("扩展字段4")
+    @TableField("prop4")
+    private String prop4;
+
+    @ApiModelProperty(value = "下单时间", readOnly = true)
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人", hidden = true)
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间", hidden = true)
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "更新人", hidden = true)
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+
+}

+ 133 - 0
auction-order/src/main/java/com/poyee/auctionorder/entity/AuctionOrderList.java

@@ -0,0 +1,133 @@
+package com.poyee.auctionorder.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 拍卖订单-子表
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Getter
+@Setter
+@TableName("auction_order_list")
+@ApiModel( description = "拍卖订单-拍品信息")
+public class AuctionOrderList extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+      @ApiModelProperty(hidden = true )
+      private Integer id;
+
+      @ApiModelProperty(value = "订单id",hidden = true)
+      @TableField("order_id")
+    private Integer orderId;
+
+      @ApiModelProperty(value = "订单编码",hidden = true)
+      @TableField("order_no")
+    private String orderNo;
+
+      @ApiModelProperty(value = "商家id",hidden = true)
+      @TableField("merchant_id")
+    private Integer merchantId;
+
+      @ApiModelProperty(value = "拍卖id",hidden = true)
+      @TableField("auction_id")
+    private String eventId;
+//    private Integer auctionId;
+
+      @ApiModelProperty(value = "用户id",hidden = true)
+      @TableField("user_id")
+    private Integer userId;
+
+      @ApiModelProperty(value = "商品id" ,readOnly = true)
+      @TableField("goods_id")
+      @NotNull(message = "商品id不能为空")
+    private String goodsId;
+
+      @ApiModelProperty("商品编码")
+      @TableField("goods_code")
+    private String goodsCode;
+
+      @ApiModelProperty(value = "商品名称" ,readOnly = true)
+      @TableField("goods_name")
+      @NotNull(message = "商品名称不能为空")
+      private String name;
+//    private String goodsName;
+
+      @ApiModelProperty(value = "数量" ,readOnly = true)
+      @TableField("num")
+      @NotNull(message = "数量不能为空")
+    private Integer num;
+
+      @ApiModelProperty(value = "图片" ,readOnly = true)
+      @TableField("imgs")
+    private String imgs;
+
+      @ApiModelProperty(value = "单价" ,readOnly = true)
+      @TableField("unint_price")
+      @NotNull(message = "单价不能为空")
+      private BigDecimal amount;
+//    private BigDecimal unintPrice;
+
+      @ApiModelProperty(value = "总价" ,readOnly = true)
+      @TableField("total_price")
+      @NotNull(message = "总价不能为空")
+      private BigDecimal totalAmount;
+//    private BigDecimal totalPrice;
+
+      @ApiModelProperty(value = "佣金" ,readOnly = true)
+      @TableField("commission")
+      @NotNull(message = "佣金不能为空")
+      private BigDecimal commissionAmount;
+//    private BigDecimal commission;
+
+      @ApiModelProperty(value = "备注" ,readOnly = true)
+      @TableField("remark")
+    private String remark;
+
+      @ApiModelProperty(value = "扩展字段1" ,readOnly = true)
+      @TableField("prop1")
+    private String prop1;
+
+      @ApiModelProperty(value = "扩展字段2" ,readOnly = true)
+      @TableField("prop2")
+    private String prop2;
+
+      @ApiModelProperty(value = "扩展字段3" ,readOnly = true)
+      @TableField("prop3")
+    private String prop3;
+
+      @ApiModelProperty(value = "扩展字段4" ,readOnly = true)
+      @TableField("prop4")
+    private String prop4;
+
+      @ApiModelProperty(value = "创建时间",hidden = true)
+      @TableField(value = "create_time" ,fill = FieldFill.INSERT)
+    private Date createTime;
+
+      @ApiModelProperty(value = "创建人",hidden = true)
+      @TableField("create_by")
+    private String createBy;
+
+      @ApiModelProperty(value = "更新时间",hidden = true)
+      @TableField(value = "update_time" ,fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+      @ApiModelProperty(value = "更新人",hidden = true)
+      @TableField("update_by")
+    private String updateBy;
+
+}

+ 18 - 0
auction-order/src/main/java/com/poyee/auctionorder/mapper/AuctionOrderListMapper.java

@@ -0,0 +1,18 @@
+package com.poyee.auctionorder.mapper;
+
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.base.mapper.IBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 拍卖订单-子表 Mapper 接口
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Mapper
+public interface AuctionOrderListMapper extends IBaseMapper<AuctionOrderList> {
+
+}

+ 50 - 0
auction-order/src/main/java/com/poyee/auctionorder/mapper/AuctionOrderMapper.java

@@ -0,0 +1,50 @@
+package com.poyee.auctionorder.mapper;
+
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.base.mapper.IBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 拍卖订单-主表 Mapper 接口
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Mapper
+public interface AuctionOrderMapper extends IBaseMapper<AuctionOrder> {
+
+    @Select(" select " +
+            "     cgoi.user_id as accountId, " +
+            "     cgoi.order_no as orderNo, " +
+            "     cgoi.payment_sub_type as paymentSubType, " +
+            "     cgoi.status , " +
+            "     cgi.display_name as auctionName " +
+            " from " +
+            "     card_group_order_info cgoi " +
+            "     left join card_group_info cgi on cgi.id = cgoi.group_info_id " +
+            " where " +
+            "   cgoi.trade_no = #{tradeNo} or cgoi.out_refund_no = #{tradeNo} limit 1"
+    )
+    public AuctionOrder selectGroupOrderInfo(@Param("tradeNo")String tradeNo);
+
+    /**
+     * 统计钱包充值
+     */
+    @Select(" select " +
+            "     sum(COALESCE(total_price,0)) totalPrice " +
+            " from " +
+            "     auction_order " +
+            " where " +
+            "   order_category = 'recharge' and status = 101 " +
+            "   and user_id = #{userId} and payment_type = #{paymentType} "
+            // and pay_category = 'BALANCE' and payment_sub_type like CONCAT('%',#{paymentSubType},'%')
+    )
+    public BigDecimal selectOrderPriceSum(@Param("userId")Integer userId, @Param("paymentType")String paymentType, @Param("paymentSubType") String paymentSubType);
+
+}

+ 29 - 0
auction-order/src/main/java/com/poyee/auctionorder/mq/MqService.java

@@ -0,0 +1,29 @@
+package com.poyee.auctionorder.mq;
+
+import com.poyee.auctionorder.mq.dto.PointOrderInfo;
+import com.poyee.mq.MqConstans;
+import com.tzy.sportcard.point.domain.AppUserPointRecord;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+@Service
+public class MqService {
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    public void sendPointMq(PointOrderInfo orderInfos, String type, int points) {
+        AppUserPointRecord pointRecord = new AppUserPointRecord();
+        pointRecord.setType(type);
+        pointRecord.setChangePoint(points);
+        pointRecord.setUserId(orderInfos.getUserId());
+        pointRecord.setOrderId(orderInfos.getId());
+        pointRecord.setOrderNo(orderInfos.getOrderNo());
+        pointRecord.setCreateTime(new Date());
+        rabbitTemplate.convertAndSend(MqConstans.EXCHANGE_USER_POINT, MqConstans.ROUTING_KEY_USER_POINT, pointRecord);
+    }
+
+}

+ 26 - 0
auction-order/src/main/java/com/poyee/auctionorder/mq/PayPreCallBackConsumer.java

@@ -0,0 +1,26 @@
+package com.poyee.auctionorder.mq;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+//@Component
+public class PayPreCallBackConsumer {
+
+    /**
+     * 回调前置消费
+     * @param data
+     * @param channel
+     * @param message
+     * @throws IOException
+     */
+    /*@RabbitHandler
+    @RabbitListener(queuesToDeclare=@Queue(MqConstans.QUEUE_PRE_PAY_CALLBACK))
+    public void payPreCallBack(ResourceData data, Channel channel, Message message) throws IOException {
+//        payCallBackConsumer(data, channel, message);
+    }*/
+
+
+
+}

+ 15 - 0
auction-order/src/main/java/com/poyee/auctionorder/mq/dto/PointOrderInfo.java

@@ -0,0 +1,15 @@
+package com.poyee.auctionorder.mq.dto;
+
+import lombok.Data;
+
+@Data
+public class PointOrderInfo {
+    //用户id
+    private Long userId;
+    //订单id
+    private Long id;
+    //订单编码
+    private String orderNo;
+
+
+}

+ 21 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/IAuctionOrderListService.java

@@ -0,0 +1,21 @@
+package com.poyee.auctionorder.service;
+
+import com.poyee.auctionorder.dto.AuctionOrderListDto;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.base.service.BaseService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 拍卖订单-子表 服务类
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+public interface IAuctionOrderListService extends BaseService<AuctionOrderList,AuctionOrderListDto> {
+
+    public List<AuctionOrderListDto> list(AuctionOrderList auctionOrder);
+
+}

+ 40 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/IAuctionOrderService.java

@@ -0,0 +1,40 @@
+package com.poyee.auctionorder.service;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.dto.CerificationOrderDto;
+import com.poyee.auctionorder.dto.OrderBayInfoEntry;
+import com.poyee.auctionorder.dto.QualifedRuleInfoDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.base.dto.Result;
+import com.poyee.base.service.BaseService;
+
+/**
+ * <p>
+ * 拍卖订单-主表 服务类
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+public interface IAuctionOrderService extends BaseService<AuctionOrder, AuctionOrderDto> {
+    //查询账户保证金
+    public Result searchAccountBond(QualifedRuleInfoDto qualifedRuleInfoDto);
+    //验证资格
+    public Result verification(QualifedRuleInfoDto qualifedRuleInfoDto);
+    //创建资格订单
+    public Result createCerificationOrder(CerificationOrderDto auctionOrderDto);
+    //创建订单
+    public Result createOrder(AuctionOrderDto auctionOrderDto);
+    //取消订单
+    public Result cancelCerificationOrder(Integer id);
+    //退款[保证金订单]
+    public Result refundCerificationOrder(OrderBayInfoEntry orderBayInfoEntry);
+
+//    //支付
+//    public Result pay(OrderBayInfoEntry orderBayInfoEntry);
+//    //支付回调返回结果
+//    public Result payBackOrder(ResourceData resourceData);
+//    //退款
+//    public Result refund(OrderBayInfoEntry orderBayInfoEntry);
+
+}

+ 38 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/OrderService.java

@@ -0,0 +1,38 @@
+package com.poyee.auctionorder.service;
+
+import com.poyee.auctionorder.dto.AuctionOrderDto;
+import com.poyee.auctionorder.dto.OrderBaseEntity;
+import com.poyee.auctionorder.dto.OrderBayInfoEntry;
+import com.poyee.auctionorder.dto.RechargeOrderDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.base.dto.Result;
+import com.poyee.base.service.BaseService;
+import com.tzy.sportcard.api.dto.ResourceData;
+
+public interface OrderService extends BaseService<AuctionOrder, AuctionOrderDto> {
+
+    public Result createOrder(AuctionOrderDto auctionOrderDto);
+    //下单并获取支付参数
+    public Result createToPay(AuctionOrderDto auctionOrderDto);
+    //下单并获取支付参数[钱包充值]
+    public Result createToRecharge(RechargeOrderDto rechargeOrderDto);
+    //支付
+    public Result pay(OrderBayInfoEntry orderBayInfoEntry);
+    //支付回调返回结果
+    public Result payBackOrder(ResourceData resourceData);
+    public Result rechargeExpendCallBack(ResourceData resourceData);
+    //退款
+    public Result refund(OrderBayInfoEntry orderBayInfoEntry);
+    //用户积分变更
+    public void changeUserPoint(AuctionOrder auctionOrder,int point);
+    //查询钱包订单
+    public Result searchRechargeOrders(OrderBaseEntity orderBaseEntity);
+    //查询单个订单信息
+    public Result searchOrderById(Integer id ,boolean checkUser);
+
+    public AuctionOrder selectGroupOrderInfo(String tradeNo);
+    //查询下次提现时间
+    public Result searchWithdrawalTime();
+
+
+}

+ 15 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/VendingMachineOrderService.java

@@ -0,0 +1,15 @@
+package com.poyee.auctionorder.service;
+
+import com.poyee.auctionorder.dto.OrderRefundInfoEntry;
+import com.poyee.auctionorder.dto.VendingMachineOrderDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.base.dto.Result;
+import com.poyee.base.service.BaseService;
+
+public interface VendingMachineOrderService extends BaseService<AuctionOrder, VendingMachineOrderDto> {
+
+    public Result getById(Integer id);
+
+    public Result refund(OrderRefundInfoEntry orderRefundInfoEntry);
+
+}

+ 34 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/impl/AuctionOrderListServiceImpl.java

@@ -0,0 +1,34 @@
+package com.poyee.auctionorder.service.impl;
+
+import com.poyee.auctionorder.dto.AuctionOrderListDto;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.auctionorder.mapper.AuctionOrderListMapper;
+import com.poyee.auctionorder.service.IAuctionOrderListService;
+import com.poyee.base.service.impl.BaseServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 拍卖订单-子表 服务实现类
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Slf4j
+@Service
+public class AuctionOrderListServiceImpl extends BaseServiceImpl<AuctionOrderListMapper, AuctionOrderList,AuctionOrderListDto> implements IAuctionOrderListService {
+
+    /**
+     * 查询订单列表
+     * @return
+     */
+    @Override
+    public List<AuctionOrderListDto> list(AuctionOrderList auctionOrder){
+        return getAllList(auctionOrder, false);
+    }
+
+}

+ 851 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/impl/AuctionOrderServiceImpl.java

@@ -0,0 +1,851 @@
+package com.poyee.auctionorder.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.poyee.auctionorder.dto.*;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.mapper.AuctionOrderMapper;
+import com.poyee.auctionorder.service.IAuctionOrderService;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.Result;
+import com.poyee.base.service.SysBaseService;
+import com.poyee.base.service.impl.BaseServiceImpl;
+import com.poyee.common.constant.Constants;
+import com.poyee.common.exception.ServiceException;
+import com.poyee.redis.util.RedisUtils;
+import com.poyee.util.RandomUtil;
+import com.poyee.util.http.HttpClientUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.util.List;
+
+import static com.poyee.util.AuctionConstant.*;
+
+/**
+ * <p>
+ * 拍卖订单-主表 服务实现类
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-11-30
+ */
+@Slf4j
+@Service
+public class AuctionOrderServiceImpl extends BaseServiceImpl<AuctionOrderMapper, AuctionOrder, AuctionOrderDto> implements IAuctionOrderService {
+
+    @Value("${auc.getNoFinished:http://txmall-bid-DEV/internal/lot/getNoFinished}")
+    private String getNoFinished;
+    @Autowired
+    private SysBaseService sysBaseService;
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    /**
+     * 查询账户保证金及账户保证积分
+     *
+     * @param qualifedRuleInfoDto
+     * @return
+     */
+    @Override
+    public Result searchAccountBond(QualifedRuleInfoDto qualifedRuleInfoDto) {
+        return Result.ok()
+                     .putDataJSON(checkAccountBond(qualifedRuleInfoDto.getAccountId(), qualifedRuleInfoDto.getOrderType()));
+    }
+
+    /**
+     * 查询账户保证金及账户保证积分
+     *
+     * @param accountId
+     * @return
+     */
+    private JSONObject checkAccountBond(String accountId, String orderType) {
+        JSONObject data = new JSONObject();
+        /*try{
+            Object accountPoint = redisUtils.hget(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_POINT);
+            Object accountAmount = redisUtils.hget(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_AMOUNT);
+            if(null == accountPoint){
+                accountPoint = 0;
+            }
+            if(null == accountAmount){
+                accountAmount = 0;
+            }
+            data.put("accountPoint", accountPoint);//账户保证积分
+            data.put("accountAmount",accountAmount);//账户保证金
+        }catch (Exception e) {*/
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setMode(MODE_ACCOUNT);
+        auctionOrder.setAccountId(Integer.valueOf(accountId));
+        auctionOrder.setStatus(101);//支付成功
+        auctionOrder.setOrderType(orderType);
+//            Result<List<AuctionOrderDto>> result = getListNoUser(auctionOrder);//获取单品保证金订单
+//            List<AuctionOrderDto> auctionOrderDtos = result.getDataList(AuctionOrderDto.class);
+        Result<AuctionOrderDto> result = getListNoToken(auctionOrder);//获取单品保证金订单
+        List<AuctionOrderDto> auctionOrderDtos = result.getDataList();
+        //统计账户保证金和账户积分【已存在】
+        final int[] point = {0};
+        final BigDecimal[] totalPrice = {new BigDecimal(0)};
+        if (null != auctionOrderDtos && auctionOrderDtos.size() > 0) {
+            auctionOrderDtos.forEach(item -> {
+                point[0] = point[0] + (null == item.getPoint() ? 0 : item.getPoint());
+                totalPrice[0] = totalPrice[0].add((null == item.getTotalPrice() ? Constants.big_zero : item.getTotalPrice()));
+            });
+        }
+        data.put("accountPoint", point[0]);//账户保证积分
+        data.put("accountAmount", totalPrice[0]);//账户保证金
+        redisUtils.hset(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_POINT, point[0]);
+        redisUtils.hset(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_AMOUNT, totalPrice[0]);
+//        }
+        return data;
+    }
+
+    /**
+     * 验证资格
+     *
+     * @param qualifedRuleInfoDto
+     * @return
+     */
+    @Override
+    public Result verification(QualifedRuleInfoDto qualifedRuleInfoDto) {
+       /* UserInfo userInfo = ServletUtils.getUserInfo();
+        if(userInfo.getUserId().equals(qualifedRuleInfoDto.getAccountId())){
+            throw new BusinessException(500,"违规请求[500]!");
+        }*/
+//        AppBaseUser appBaseUser = getAppUserInfo(Integer.valueOf(qualifedRuleInfoDto.getAccountId()));
+        String mode = qualifedRuleInfoDto.getMode();//保证金类型
+        if (!modes.contains(mode)) {
+            return Result.error("不符合拍卖资格[mode:保证金类型不符合规范]!");
+        }
+        String category = qualifedRuleInfoDto.getCategory();//类别
+        if (!categorys.contains(category)) {
+            return Result.error("不符合拍卖资格[category:保证金类别不符合规范]!");
+        }
+        if (!qualifedRuleInfoDto.checkNullCategory()) {
+            return Result.error("不符合拍卖资格[对应保证金类别的规则设置错误]!");
+        }
+        AuctionOrderDto auctionOrderDto = new AuctionOrderDto();
+        JSONObject jsonObject = checkAccountBond(qualifedRuleInfoDto.getAccountId(), qualifedRuleInfoDto.getOrderType());
+        if (null == jsonObject || jsonObject.isEmpty()) {
+            return Result.error("不符合拍卖资格[未支付该拍品保证金]!");
+        }
+        auctionOrderDto.setPoint((Integer) jsonObject.get("accountPoint"));
+        auctionOrderDto.setTotalPrice(new BigDecimal(String.valueOf(jsonObject.get("accountAmount"))));
+        return checkCerification(qualifedRuleInfoDto, auctionOrderDto);
+    }
+
+    /**
+     * @param qualifedRuleInfoDto 规则
+     * @param auctionOrderDto     用户已提交
+     * @return
+     */
+    private Result checkCerification(QualifedRuleInfoDto qualifedRuleInfoDto, AuctionOrderDto auctionOrderDto) {
+        Integer point = null == auctionOrderDto.getPoint() ? 0 : auctionOrderDto.getPoint();
+        BigDecimal totalPrice = null == auctionOrderDto.getTotalPrice() ? new BigDecimal(0) : auctionOrderDto.getTotalPrice();
+        JSONObject data = new JSONObject();
+        data.put("accountPoint", point);//账户保证积分
+        data.put("accountAmount", totalPrice);//账户保证金
+        if (qualifedRuleInfoDto.getCategory()
+                               .equals(CATEGORY_POINT)) {//积分
+            if (point.compareTo(qualifedRuleInfoDto.getPoint()) == -1) {
+                data.put("point", qualifedRuleInfoDto.getPoint() - point.intValue());
+                return Result.error("不符合拍卖资格[未支付或保证金未达标:积分]!")
+                             .putDataJSON(data)
+                        ;
+            }
+        } else if (qualifedRuleInfoDto.getCategory()
+                                      .equals(CATEGORY_AMOUNT)) {//金额
+            if (totalPrice.compareTo(qualifedRuleInfoDto.getAmount()) == -1) {
+                data.put("amount", qualifedRuleInfoDto.getAmount()
+                                                      .subtract(totalPrice));
+                return Result.error("不符合拍卖资格[未支付或保证金未达标:金额]!")
+                             .putDataJSON(data)
+                        ;
+            }
+        } else if (qualifedRuleInfoDto.getCategory()
+                                      .equals(CATEGORY_PAMOUNT)) {//积分+金额
+            boolean isPass = true;
+            if (point.compareTo(qualifedRuleInfoDto.getPoint()) == -1) {
+                data.put("point", qualifedRuleInfoDto.getPoint() - point.intValue());
+                isPass = false;
+            }
+            if (totalPrice.compareTo(qualifedRuleInfoDto.getAmount()) == -1) {
+                data.put("amount", qualifedRuleInfoDto.getAmount()
+                                                      .subtract(totalPrice));
+                isPass = false;
+            }
+            if (!isPass) {
+                return Result.error("不符合拍卖资格[未支付或保证金未达标:积分+金额]!")
+                             .putDataJSON(data)
+                        ;
+            }
+        } else if (qualifedRuleInfoDto.getCategory()
+                                      .equals(CATEGORY_POINTORAMOUNT)) {//积分 或 金额
+            if (point.compareTo(qualifedRuleInfoDto.getPoint()) == -1
+                    && totalPrice.compareTo(qualifedRuleInfoDto.getAmount()) == -1) {
+                data.put("point", qualifedRuleInfoDto.getPoint() - point.intValue());
+                data.put("amount", qualifedRuleInfoDto.getAmount()
+                                                      .subtract(totalPrice));
+                return Result.error("不符合拍卖资格[未支付或保证金未达标:积分或金额]!")
+                             .putDataJSON(data)
+                        ;
+            }
+        }
+        return Result.ok("符合资格!")
+                     .putDataJSON(data);
+    }
+
+    /**
+     * 创建保证金订单
+     *
+     * @param auctionOrderDto
+     * @return
+     */
+    @Override
+    public Result createCerificationOrder(CerificationOrderDto auctionOrderDto) {
+        AuctionOrder auctionOrder = new AuctionOrder();
+        AppBaseUser appUserInfo = getAppUserInfo();
+        try {
+            auctionOrder.setOrderType(auctionOrderDto.getOrderType());
+            auctionOrder.setOrderCategory(auctionOrderDto.getOrderCategory());
+            auctionOrder.setAccountId(appUserInfo.getId());//设置用户id
+            auctionOrder.setAuctionName("保证金");
+            auctionOrder.setStatus(100);//待支付订单
+            Result<AuctionOrder> one = getOne(auctionOrder);
+            if (one.isSuccess()) {
+                return Result.error(100, "您有待支付订单需要支付!")
+                             .putDataJSON(one.getData());
+            }
+            BeanUtils.copyProperties(auctionOrder, auctionOrderDto);
+            auctionOrder.setAccountId(appUserInfo.getId());//设置用户id
+            auctionOrder.setAccount(appUserInfo.getUsername());//设置用户账号
+            auctionOrder.setFreightAmount(null);
+            auctionOrder.setAuctionName("保证金");
+            auctionOrder.setPayTimeLimit(auctionOrderDto.getPayTimeLimit());
+            auctionOrder.setOrderNo(RandomUtil.getRandom(RandomUtil.AUCTION_ORDER));
+            auctionOrder.setMode(StringUtils.isNotEmpty(auctionOrder.getMode()) ? auctionOrder.getMode()
+                                                                                              .toUpperCase() : auctionOrder.getMode());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        if (CATEGORY_POINT.equals(auctionOrderDto.getPayCategory())) {
+            // 如果是积分  查询用户积分,且对用户积分进行扣除
+            int point = Math.toIntExact(appUserInfo.getPoint());
+            if (null == auctionOrderDto.getPoint()) {
+                return Result.error("创建订单失败[point:该类型下积分值不能为空]!");
+            }
+            int inPoint = auctionOrderDto.getPoint() * 100;
+            if (inPoint > point) {
+                return Result.error("创建订单失败:积分不足[用户积分:" + point / 100 + "]!");
+            }
+            auctionOrder.setStatus(101);
+            auctionOrder.setTotalPrice(null);
+            boolean save = save(auctionOrder);
+            if (save) {
+                point = point - inPoint;
+                //扣除用户积分到拍卖积分订单
+                orderService.changeUserPoint(auctionOrder, -inPoint);
+                AuctionOrderDto retEntity = info(auctionOrder.getId()).getData();
+                //更新redis 中的 账户保证金和账户保证积分
+                updateBondAtRedis(auctionOrder.getOrderType(), String.valueOf(auctionOrder.getAccountId()), point, Constants.big_zero);
+                return Result.ok(retEntity);
+            }
+        } else if (CATEGORY_PAMOUNT.equals(auctionOrderDto.getPayCategory())) {
+            // 如果是积分+金额
+            int point = Math.toIntExact(appUserInfo.getPoint());
+            if (null == auctionOrderDto.getPoint()) {
+                return Result.error("创建订单失败[point:该类型下积分值不能为空]!");
+            }
+            int inPoint = auctionOrderDto.getPoint() * 100;
+            if (0 == auctionOrderDto.getPoint() && Constants.big_zero.compareTo(auctionOrderDto.getTotalPrice()) != -1) {
+                return Result.error("创建订单失败[该类型下积分值和金额不能同时为空或0]!");
+            }
+            if (inPoint > point) {
+                return Result.error("创建订单失败:积分不足[用户积分:" + point / 100 + "]!");
+            }
+            boolean save = save(auctionOrder);
+            if (save) {
+                point = point - inPoint;
+                //扣除用户积分到拍卖积分订单
+                orderService.changeUserPoint(auctionOrder, -inPoint);
+                AuctionOrderDto retEntity = info(auctionOrder.getId()).getData();
+                //更新redis 中的 账户保证金和账户保证积分
+                updateBondAtRedis(auctionOrder.getOrderType(), String.valueOf(auctionOrder.getAccountId()), point, Constants.big_zero);
+                return Result.ok(retEntity);
+            }
+        } else if (CATEGORY_POINTORAMOUNT.equals(auctionOrderDto.getPayCategory())) {
+            // 如果是 积分或金额
+            int point = Math.toIntExact(appUserInfo.getPoint());
+            int inPoint = null == auctionOrderDto.getPoint() ? 0 : auctionOrderDto.getPoint() * 100;
+            if (null != auctionOrderDto.getPoint() && inPoint <= point) {
+                //如果积分符合 则直接扣除积分
+                auctionOrder.setStatus(101);
+                auctionOrder.setTotalPrice(null);
+                boolean save = save(auctionOrder);
+                if (save) {
+                    point = point - inPoint;
+                    //扣除用户积分到拍卖积分订单
+                    orderService.changeUserPoint(auctionOrder, -inPoint);
+                    AuctionOrderDto retEntity = info(auctionOrder.getId()).getData();
+                    //更新redis 中的 账户保证金和账户保证积分
+                    updateBondAtRedis(auctionOrder.getOrderType(), String.valueOf(auctionOrder.getAccountId()), point, Constants.big_zero);
+                    return Result.ok(retEntity);
+                }
+            } else {
+                //如果积分不符合 则 直接生成待支付订单 (保留积分和金额数据,等待下次支付时 进行处理)
+                boolean save = save(auctionOrder);
+                if (save) {
+                    AuctionOrderDto retEntity = info(auctionOrder.getId()).getData();
+                    return Result.ok(retEntity);
+                }
+            }
+        } else {
+            if (CATEGORY_AMOUNT.equals(auctionOrderDto.getPayCategory())) {
+                auctionOrder.setPoint(null);
+            }
+            //如果是金额保证金 则直接生成订单
+            boolean save = save(auctionOrder);
+            if (save) {
+                AuctionOrderDto retEntity = info(auctionOrder.getId()).getData();
+                return Result.ok(retEntity);
+            }
+        }
+        return Result.error("创建保证金订单失败[001]!");
+    }
+
+    /**
+     * 更新缓存中的账户保证金
+     *
+     * @param oorderType
+     * @param accountId
+     * @param point
+     * @param amount
+     */
+    private void updateBondAtRedis(String oorderType, String accountId, Integer point, BigDecimal amount) {
+        JSONObject jsonObject = checkAccountBond(oorderType, accountId);
+        Integer accountPoint = 0;
+        BigDecimal accountAmount = Constants.big_zero;
+        if (null != jsonObject && !jsonObject.isEmpty()) {
+            if (null == jsonObject.get("accountPoint")) {
+                accountPoint = accountPoint + point;
+            } else {
+                accountPoint = (Integer) jsonObject.get("accountPoint") + point;
+            }
+            accountPoint = accountPoint / 100;
+            if (null == jsonObject.get("accountAmount")) {
+                accountAmount = accountAmount.add(amount);
+            } else {
+                accountAmount = new BigDecimal(String.valueOf(jsonObject.get("accountAmount"))).add(amount);
+            }
+        }
+        redisUtils.hset(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_POINT, accountPoint);
+        redisUtils.hset(AUCTION_ACCOUNT_BOND + accountId, ACCOUNT_AMOUNT, accountAmount);
+    }
+
+    /**
+     * 创建订单
+     *
+     * @param auctionOrderDto
+     * @return
+     */
+    @Override
+    public Result createOrder(AuctionOrderDto auctionOrderDto) {
+        if (null != auctionOrderDto && null == auctionOrderDto.getAccountId()) {
+            return Result.error("创建订单失败[用户id不能为空]!");
+        }
+        auctionOrderDto.setMode(StringUtils.isNotEmpty(auctionOrderDto.getMode()) ? auctionOrderDto.getMode()
+                                                                                                   .toUpperCase() : auctionOrderDto.getMode());
+        auctionOrderDto.setOrderNo(RandomUtil.getRandom(RandomUtil.AUCTION_ORDER));
+        return orderService.createOrder(auctionOrderDto);
+    }
+
+    //取消订单
+    @Override
+    public Result cancelCerificationOrder(Integer id) {
+        AppBaseUser appUserInfo = getAppUserInfo();
+        if (null == appUserInfo) {
+            return Result.error("请重新登录后重试!");
+        }
+        Result<AuctionOrder> result = detail(id);
+        if (!result.isSuccess()) {
+            return Result.error("未查到该订单!");
+        }
+        AuctionOrder auctionOrder = result.getData();
+        if (null != auctionOrder && (null == auctionOrder.getAccountId() || !appUserInfo.getId()
+                                                                                        .equals(auctionOrder.getAccountId()))) {
+            return Result.error("订单信息异常!");
+        }
+        if (!Constants.cancel_status.contains(auctionOrder.getStatus())) {
+            return Result.error("该订单不能取消【" + sysBaseService.selectDictLabel("order_status", String.valueOf(auctionOrder.getStatus())) + "】!");
+        }
+        auctionOrder.setStatus(202);//用户取消
+        updateById(auctionOrder);
+        return Result.success("取消成功!");
+    }
+
+    /**
+     * 退款[保证金订单]
+     *
+     * @param orderBayInfoEntry
+     * @return
+     */
+    @Override
+    public Result refundCerificationOrder(OrderBayInfoEntry orderBayInfoEntry) {
+        //验证用户账户保证金是否还能支持这些拍品
+        AppBaseUser appUserInfo = getAppUserInfo();
+        if (null == appUserInfo || null == appUserInfo.getId()) {
+            throw new ServiceException("请重新登录后再试[未获取到用户信息]!");
+        }
+        //查询用户订单信息
+        AuctionOrder auctionOrder = getById(orderBayInfoEntry.getId());//订单信息
+        if (null == auctionOrder) {
+            return Result.error("退款失败【未查到订单信息】!");
+        }
+        if (null == auctionOrder.getAccountId() || auctionOrder.getAccountId()
+                                                               .equals(appUserInfo.getId())) {
+            return Result.error("退款失败【用户信息不符合】!");
+        }
+        //判断订单状态
+        if (Constants.refund_status.contains(auctionOrder.getStatus())) {
+            return Result.error("退款失败【" + sysBaseService.selectDictLabel("order_status", String.valueOf(auctionOrder.getStatus())) + "】!");
+        }
+        //拍品支付回传
+        JSONObject param = new JSONObject();
+        param.put("accountId", appUserInfo.getId()
+                                          .toString());
+        String ret = HttpClientUtil.httpRequestJSON(getNoFinished, "POST", JSONArray.toJSONString(param), null);
+        log.info(" 请求接口:{} 返回结果:{}", getNoFinished, ret);
+        try {
+            JSONObject retJSON = JSONObject.parseObject(ret);
+            if (200 != retJSON.getInteger("code")) {
+                return Result.error(retJSON.getString("msg"));
+            }
+            JSONArray data = retJSON.getJSONArray("data");
+            if (null != data && !data.isEmpty()) {
+                List<UserAuctionOrderEntry> userAuctionOrderEntries = JSONArray.parseArray(JSONObject.toJSONString(data), UserAuctionOrderEntry.class);
+                //计算用户在支付订单[拍品订单]所需的总保证金和总积分
+                BigDecimal totalAmount = userAuctionOrderEntries.stream()
+                                                                .map(item -> {
+                                                                    if (!CATEGORY_POINT.equals(item.getDepositCategory())) {
+                                                                        return item.getDepositAmount();
+                                                                    } else {
+                                                                        return null;
+                                                                    }
+                                                                })
+                                                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+                Integer totalPoint = userAuctionOrderEntries.stream()
+                                                            .map(item -> {
+                                                                if (!CATEGORY_AMOUNT.equals(item.getDepositCategory())) {
+                                                                    return item.getDepositPoint();
+                                                                } else {
+                                                                    return null;
+                                                                }
+                                                            })
+                                                            .reduce(0, Integer::sum);
+                //获取用户的保证金
+                JSONObject jsonObject = checkAccountBond(auctionOrder.getOrderType(), String.valueOf(appUserInfo.getId()));
+                Integer accountPoint = jsonObject.getInteger("accountPoint");//账户保证积分
+                BigDecimal accountAmount = jsonObject.getBigDecimal("accountAmount");//账户保证金
+                JSONObject errJson = new JSONObject();
+                errJson.put("accountPoint", accountPoint);//账户保证积分
+                errJson.put("accountAmount", accountAmount);//账户保证金
+                errJson.put("totalPoint", totalPoint);//所需总积分
+                errJson.put("totalAmount", totalAmount);//所需总金额
+                userAuctionOrderEntries.clear();//清除list
+                //如果退款时积分不符合-则不让退款
+                if (!CATEGORY_AMOUNT.equals(auctionOrder.getPayCategory()) && accountPoint < totalPoint + auctionOrder.getPoint()) {
+                    return Result.error("退款失败【退款后账户保证金或积分不达标】!")
+                                 .putDataJSON(errJson)
+                            ;
+                }
+                //比较退款时金额是否符合
+                if (!CATEGORY_POINT.equals(auctionOrder.getPayCategory()) && accountAmount.compareTo(totalAmount.add(auctionOrder.getTotalPrice())) == -1) {
+                    return Result.error("退款失败【退款后账户保证金或积分不达标】!")
+                                 .putDataJSON(errJson)
+                            ;
+                }
+            }
+            //如果没问题可以进行退款
+            orderBayInfoEntry.setRefundType("all");
+            return orderService.refund(orderBayInfoEntry);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("退款失败[" + e.getMessage() + "]!");
+        }
+    }
+    /* *//**
+     * 支付
+     * @param orderBayInfoEntry
+     * @return
+     *//*
+    @Override
+    public Result pay(OrderBayInfoEntry orderBayInfoEntry){
+        Result<AuctionOrder> info = detail(orderBayInfoEntry.getId());
+        if(info.isSuccess()){
+            AuctionOrder auctionOrderDto = info.getData();
+//            AuctionOrder auctionOrderDto = info.getData(AuctionOrder.class);
+            //计算需要支付的金额(商品订单金额+运费-优惠券)
+            BigDecimal totalPrice = auctionOrderDto.getTotalPrice();
+            if(null == totalPrice){
+                return Result.error("订单支付金额异常,请确认订单金额!");
+            }
+            if(null != orderBayInfoEntry.getAddressId() && 0 != orderBayInfoEntry.getAddressId()){
+                //保存订单的物流信息
+                Result orderCourierRecord = orderCourierRecordService.holdOrderCourierRecord(orderBayInfoEntry, auctionOrderDto);
+               if(!orderCourierRecord.isSuccess()){
+                   return orderCourierRecord;
+               }
+            }
+            if(null != auctionOrderDto && StringUtils.isNotEmpty(auctionOrderDto.getPaymentType())
+                && auctionOrderDto.getPaymentType().equals(orderBayInfoEntry.getPayType()) && StringUtils.isNotEmpty(auctionOrderDto.getPayData())
+            ){
+                //判断支付时间是否当前时间 如果是 则重新生成订单
+                if(new Date().before(auctionOrderDto.getPaymentTime())){
+                    return Result.ok(JSONObject.parseObject(auctionOrderDto.getPayData()));
+                }
+            }
+            BigDecimal freightAmount = null == auctionOrderDto.getFreightAmount() ? new BigDecimal(0) : auctionOrderDto.getFreightAmount();
+            BigDecimal discount = null == auctionOrderDto.getDiscount() ? new BigDecimal(0) : auctionOrderDto.getDiscount();
+            BigDecimal parPrice =  totalPrice.add(freightAmount).subtract(discount);
+            JSONObject payRequestBody = new JSONObject();
+            payRequestBody.put("userType","APP");
+            payRequestBody.put("category","auction");//支付模块 : 拍卖
+            payRequestBody.put("orderNo",auctionOrderDto.getOrderNo()); //订单编码
+            payRequestBody.put("totalAmount",parPrice);//支付金额
+            payRequestBody.put("body",StringUtils.isEmpty(auctionOrderDto.getAuctionName()) ? "球星卡片" : auctionOrderDto.getAuctionName());//支付商品描述
+            payRequestBody.put("payWay",orderBayInfoEntry.getPayType()); //支付方式
+            payRequestBody.put("createip",IpUtils.getHostIp()); //请求ip
+            payRequestBody.put("createOrderTime",auctionOrderDto.getCreateTime()); //订单创建时间
+            Date expireTime = (null == auctionOrderDto.getPayTimeLimit() || auctionOrderDto.getPayTimeLimit().before(new Date())) ? DateUtils.addCalendar(new Date(),DateUtils.day,3) : auctionOrderDto.getPayTimeLimit();
+            //如果没有支付过期时间 则默认3天后过期
+            payRequestBody.put("expireTime",expireTime);//订单过期时间 如果为空则设置为付款期限
+            try {
+                String ret = null;
+                if(unified.contains("http:")){
+                    ret = HttpClientUtil.httpRequestJSON(unified,"POST", JSONObject.toJSONString(payRequestBody),null);
+                }else{
+                    Map<String ,String> header = new HashMap<>();
+                    header.put("Content-Type", "application/json");
+                    ret = HttpClientUtil.httpsRequest(unified,"POST", JSONObject.toJSONString(payRequestBody),header);
+                }
+                Result result = JSONObject.parseObject(ret, Result.class);
+                log.info(" 下单返回数据:》》》 {}", result);
+                if(null != result){
+                    if(result.isSuccess()){
+                        JSONObject jsonResult = (JSONObject) result.getResult().get("result");
+                        //更新订单信息
+                        auctionOrderDto.setPaymentType(orderBayInfoEntry.getPayType());//支付方式
+                        auctionOrderDto.setPaymentSubType(result.getString("paymentSubType"));//支付子类型
+                        auctionOrderDto.setPayData(JSONObject.toJSONString(result.getResult()));//支付参数
+                        auctionOrderDto.setTradeNo(jsonResult.getString("merOrderId"));//支付编码
+                        auctionOrderDto.setPaymentTime(new Date());
+                        auctionOrderDto.setStatus(100);//待付款
+                        boolean b = updateById(auctionOrderDto);
+                        log.info(" 支付下单 更新订单信息:{} ",b);
+                        Map map = result.getResult();
+                        map.remove("paymentSubType");
+                        result.setResult(null);
+                        result.setData(map);
+                    }
+                    return result;
+                }else{
+                    throw new ServiceException(-1,"支付下单失败[001]!");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException(-1,"系统错误,支付下单失败!");
+            }
+        }
+        return info;
+    }
+
+    *//**
+     * 支付成功回调
+     * @param resourceData
+     * @return
+     *//*
+    @Override
+    public Result payBackOrder(ResourceData resourceData){
+        String out_trade_no = resourceData.getOut_trade_no();
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setTradeNo(out_trade_no);
+        //判断是否已经支付成功
+        auctionOrder = getOne(checkWrapper(auctionOrder,false), false);
+        if(null != auctionOrder){
+            if( 101 == auctionOrder.getStatus() || (101 != auctionOrder.getStatus() && Constants.TRADE_SUCCESS_EN.equals(auctionOrder.getPaymentStatus())) ){
+                return Result.success();
+            }
+            auctionOrder.setPaymentSuccessTime(DateUtils.parseDate(resourceData.getSuccess_time()));
+            auctionOrder.setStatus(101);//101 支付成功
+            auctionOrder.setPaymentMsg(JSONObject.toJSONString(resourceData));
+            auctionOrder.setPaymentStatus(resourceData.getTrade_state());
+            auctionOrder.setPaymentNum(resourceData.getTransaction_id());
+            auctionOrder.setActualPayable(new BigDecimal(resourceData.getAmount().getPayer_total()).divide(new BigDecimal(100)));
+            boolean b = updateById(auctionOrder);
+            if(b){
+                //添加财务对账
+                AuctionOrder finalAuctionOrder = auctionOrder;
+                Thread t = new Thread(){
+                    @Override
+                    public void run() {
+                        try {
+                            OrderBaseInfoDto orderBaseInfoDto = new OrderBaseInfoDto();
+                            BeanUtils.copyProperties(orderBaseInfoDto, finalAuctionOrder);
+                            orderBaseInfoDto.setMerchantId(Long.valueOf(finalAuctionOrder.getShopId()));//商家id
+                            orderBaseInfoDto.setTradeNo(finalAuctionOrder.getTradeNo());//tradeNo
+                            orderBaseInfoDto.setUserId(Long.valueOf(finalAuctionOrder.getAccountId()));//用户id
+                            orderBaseInfoDto.setPaymentSubType(finalAuctionOrder.getPaymentSubType());//支付子类型
+                            orderBaseInfoDto.setPaymentType(finalAuctionOrder.getPaymentType());//支付类型
+                            orderBaseInfoDto.setActualPayment(finalAuctionOrder.getActualPayable());//实付金额
+                            orderBaseInfoDto.setAccountsPayable(finalAuctionOrder.getTotalPrice());//应付金额
+                            orderBaseInfoDto.setPurchaseCount(Long.valueOf(finalAuctionOrder.getNum()));//数量
+                            sysBaseService.insertSysFinceByOrder(orderBaseInfoDto,"支付");
+                            //拍品支付回传
+                            AuctionOrderList auctionOrderList = new AuctionOrderList();
+                            auctionOrderList.setOrderId(Math.toIntExact(orderBaseInfoDto.getId()));
+                            List<AuctionOrderListDto> list = auctionOrderListService.list(auctionOrderList);
+                            log.info(" 查询子表数据:{}",list);
+                            if(null != list && list.size() > 0){
+                                List<String> collect = list.stream().map(item-> {
+                                    AuctionOrderListDto auctionOrderListDto = JSONObject.parseObject(JSONObject.toJSONString(item), AuctionOrderListDto.class);
+                                    return auctionOrderListDto.getGoodsId();
+                                    }).collect(Collectors.toList());
+                                JSONArray array = (JSONArray) JSONArray.toJSON(collect);
+                                log.info("  传入数据:{}",array);
+                                String ret = HttpClientUtil.httpRequestJSON(internalLot, "POST", JSONArray.toJSONString(array), null);
+                                log.info(" 请求接口:{} 返回结果:{}",internalLot,ret);
+                            }
+                            *//*JSONArray array = new JSONArray();
+                            array.add(finalAuctionOrder.getEventId());
+                            String ret = HttpClientUtil.httpRequestJSON(internalLot, "POST", JSONArray.toJSONString(array), null);
+                            log.info(" 请求接口:{} 返回结果:{}",internalLot,ret);*//*
+                        } catch (IllegalAccessException e) {
+                            e.printStackTrace();
+                        } catch (InvocationTargetException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                };
+                pools.execute(t);
+                return Result.ok("操作成功");
+            }
+        }
+        return  Result.error("更新出错!");
+    }
+
+    *//**
+     * 退款
+     * @param orderBayInfoEntry
+     * @return
+     *//*
+    @Override
+    public Result refund(OrderBayInfoEntry orderBayInfoEntry){
+        AuctionOrder auctionOrder = getById(orderBayInfoEntry.getId());//订单信息
+        //判断订单状态
+        if( Constants.refund_status.contains(auctionOrder.getStatus()) ){
+            return Result.error("退款失败【"+sysBaseService.selectDictLabel("order_status", String.valueOf(auctionOrder.getStatus()))+"】!");
+        }
+        Result queryInfo = Result.error();
+        if( ((auctionOrder.getActualPayable() == null || Constants.big_zero.compareTo(auctionOrder.getActualPayable()) == 0 )
+                && auctionOrder.getPoint() > 0) ){
+            queryInfo = Result.success();
+        }else{
+            queryInfo = queryPayInfo(auctionOrder);
+        }
+        if(queryInfo.isSuccess() ) {
+            if(Constants.refund_freight.equals(orderBayInfoEntry.getRefundType()) &&
+               (null == auctionOrder.getFreightAmount() || Constants.big_zero.compareTo(auctionOrder.getFreightAmount()) > -1) ){
+                return Result.error("退款失败【该订单无快递费可退】请确认订单信息!");
+            }
+            if(Constants.refund_order.equals(orderBayInfoEntry.getRefundType()) &&
+                    (null == auctionOrder.getActualPayable() || Constants.big_zero.compareTo(auctionOrder.getActualPayable()) == 0) ){
+                return Result.error("退款失败【该订单无费用可退】请确认订单信息!");
+            }
+            //进行退款
+            BigDecimal refundFee = Constants.big_zero;
+            //如果退款金额为空 则直接退订单可退金额
+            BigDecimal actualPayable = null != auctionOrder.getActualPayable() ? auctionOrder.getActualPayable() :Constants.big_zero;//实际支付金额
+            BigDecimal freightAmount = null != auctionOrder.getFreightAmount() ? auctionOrder.getFreightAmount() :Constants.big_zero;//快递费
+            BigDecimal refundFeed = null == auctionOrder.getRefundFee() ? Constants.big_zero : auctionOrder.getRefundFee();//已退款金额
+            //传入退款金额
+            BigDecimal inRefundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? Constants.big_zero : new BigDecimal(orderBayInfoEntry.getRefundFee());
+            //如果退运费
+            if( Constants.refund_freight.equals(orderBayInfoEntry.getRefundType())){
+                refundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? freightAmount : inRefundFee;
+            } else
+            //如果退订单
+            if(Constants.refund_order.equals(orderBayInfoEntry.getRefundType())){
+                refundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? actualPayable.subtract(refundFeed) : inRefundFee;
+                if(refundFee.compareTo(actualPayable.subtract(refundFeed)) > 1){
+                    return Result.error("退款失败【超过该订单可退金额:"+actualPayable.subtract(refundFeed)+"】请确认订单信息!");
+                }
+            } else // if(Constants.refund_order.equals(orderBayInfoEntry.getRefundType())) //如果 全部退款:包含订单和快递费
+            {
+                //如果 全部退款:包含订单和快递费(默认) 直接退款,不取所传金额
+                refundFee = actualPayable.subtract(refundFeed).add(freightAmount);
+            }
+            //如果是保证金订单 退回保证金及积分
+            boolean refundPoint = false;
+            if(null != auctionOrder.getPoint() && 0 != auctionOrder.getPoint()){
+                changeUserPoint(auctionOrder,auctionOrder.getPoint()*100);
+                refundPoint = true;
+            }
+            //退款操作 1 > 0 = -1 <
+            if(Constants.big_zero.compareTo(refundFee) > -1){
+                if(refundPoint){
+                    auctionOrder.setStatus(205);//已经完全退款
+                    auctionOrder.setRefundSuccessTime(new Date());
+                    boolean b = updateById(auctionOrder);
+                    return Result.success("已完成退款!");
+                }
+                return Result.error("退款失败【该订单无可退金额:"+refundFee+"】请确认订单信息!");
+            }
+            //调用接口查询是否已经支付成功
+            JSONObject refundRequestBody = new JSONObject();
+            refundRequestBody.put("payWay", auctionOrder.getPaymentSubType()); //支付方式
+            refundRequestBody.put("orderNo", auctionOrder.getTradeNo());//支付编码
+            refundRequestBody.put("refundAmount", refundFee);//需要退款金额
+            refundRequestBody.put("refundMsg", orderBayInfoEntry.getRefundMsg());//退款描述
+            String ret = null;
+            if(refund.contains("http:")){
+                ret = HttpClientUtil.httpRequestJSON(refund,"POST", JSONObject.toJSONString(refundRequestBody),null);
+            }else{
+                Map<String ,String> header = new HashMap<>();
+                header.put("Content-Type", "application/json");
+                ret = HttpClientUtil.httpsRequest(refund,"POST", JSONObject.toJSONString(refundRequestBody),header);
+            }
+            Result result = JSONObject.parseObject(ret, Result.class);
+            log.info(" 退款返回数据:》》》 {}", result);
+            if(null != result){
+                if(result.isSuccess()){
+                    Map map = result.getResult();
+                    JSONObject jsonResult = new JSONObject(map);
+                    //根据退款状态修改订单状态:
+                    JSONObject data = jsonResult.getJSONObject("data");
+                    String refundChange = data.getString("fund_change");
+                    *//*if(!Constants.refund_order.equals(orderBayInfoEntry.getRefundType())){
+                        //退款配送费
+//                        auctionOrder.setFreightAmount(freightAmount.subtract(refundFee));
+                    }*//*
+                    auctionOrder.setRefundStatus(data.getString("refund_status"));//退款状态
+                    auctionOrder.setRefundFee(refundFeed.add(refundFee));//总退款金额
+                    auctionOrder.setRefundNo(data.getString("out_refund_no"));
+                    auctionOrder.setRefundTime(new Date());
+                    auctionOrder.setRefundMsg(StringUtils.isNotEmpty(auctionOrder.getMsg()) ? auctionOrder.getMsg()+","+data.toJSONString():data.toJSONString());//退款返回数据
+                    if(refundChange.equals("Y")){//退款操作成功
+                        if(auctionOrder.getRefundFee().compareTo(actualPayable) == 0){
+                            auctionOrder.setStatus(205);//已经完全退款
+                            auctionOrder.setRefundSuccessTime(new Date());
+                        }
+                    } else if(refundChange.equals("P")) {//退款中,等待退款回调
+                        auctionOrder.setStatus(204);//退款中
+                    }
+                    boolean b = updateById(auctionOrder);
+                    if(b && refundChange.equals("Y")){
+                        //财务对账记录
+                        AuctionOrder finalAuctionOrder = auctionOrder;
+                        Thread t = new Thread(){
+                            @Override
+                            public void run() {
+                                try {
+                                    OrderBaseInfoDto orderBaseInfoDto = new OrderBaseInfoDto();
+                                    BeanUtils.copyProperties(orderBaseInfoDto, finalAuctionOrder);
+                                    orderBaseInfoDto.setMerchantId(Long.valueOf(finalAuctionOrder.getShopId()));//商家id
+                                    orderBaseInfoDto.setTradeNo(finalAuctionOrder.getTradeNo());//tradeNo
+                                    orderBaseInfoDto.setUserId(Long.valueOf(finalAuctionOrder.getAccountId()));//用户id
+                                    orderBaseInfoDto.setPaymentSubType(finalAuctionOrder.getPaymentSubType());//支付子类型
+                                    orderBaseInfoDto.setPaymentType(finalAuctionOrder.getPaymentType());//支付类型
+                                    orderBaseInfoDto.setActualPayment(finalAuctionOrder.getActualPayable());//实付金额
+                                    orderBaseInfoDto.setAccountsPayable(finalAuctionOrder.getTotalPrice());//应付金额
+                                    orderBaseInfoDto.setPurchaseCount(Long.valueOf(finalAuctionOrder.getNum()));//数量
+                                    orderBaseInfoDto.setOutRefundNo(data.getString("out_refund_no"));
+                                    sysBaseService.insertSysFinceByOrder(orderBaseInfoDto,"退款");
+                                    //如果是保证金订单 退回保证金及积分
+                                    *//*if(null != auctionOrder.getPoint() && 0 != auctionOrder.getPoint()){
+                                        changeUserPoint(auctionOrder,auctionOrder.getPoint());
+                                    }*//*
+                                } catch (IllegalAccessException e) {
+                                    e.printStackTrace();
+                                } catch (InvocationTargetException e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        pools.execute(t);
+                    }
+                    return Result.success("操作成功!");
+                }
+                return Result.success(result.getMsg());
+            }else{
+                throw new ServiceException(-1,"退款失败[未查到支付信息]!");
+            }
+        }else{
+            if("TRADE_REFUND".equals(queryInfo.getMsg())){
+                //已经退款
+                auctionOrder.setStatus(205);//已经完全退款
+                boolean b = updateById(auctionOrder);
+                log.info(" 已经完成退款>>{} ",auctionOrder);
+                return Result.success("已完成退款[000]!");
+            }
+            return queryInfo;
+        }
+    }
+
+    */
+    /**
+     * 用户积分变更
+     * @param auctionOrder
+     * @param point 负为扣除,正为增加
+     *//*
+    private void changeUserPoint(AuctionOrder auctionOrder,int point) {
+        //扣除用户积分到拍卖积分订单
+        PointOrderInfo orderInfo = new PointOrderInfo();
+        orderInfo.setId(Long.valueOf(auctionOrder.getId()));
+        orderInfo.setUserId(Long.valueOf(auctionOrder.getAccountId()));
+        orderInfo.setOrderNo(auctionOrder.getOrderNo());
+        mqService.sendPointMq(orderInfo, MqConstans.POINT_AUCTION, point);
+    }
+
+    *//**
+     * 查询订单支付情况
+     * @param auctionOrder
+     * @return
+     *//*
+    private Result queryPayInfo(AuctionOrder auctionOrder) {
+        //调用接口查询是否已经支付成功
+        JSONObject payRequestBody = new JSONObject();
+        payRequestBody.put("payWay", auctionOrder.getPaymentSubType()); //支付方式
+        payRequestBody.put("orderNo", auctionOrder.getTradeNo());//支付编码
+        String ret = null;
+        if(query.contains("http:")){
+            ret = HttpClientUtil.httpRequestJSON(query,"POST", JSONObject.toJSONString(payRequestBody),null);
+        }else{
+            Map<String ,String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+            ret = HttpClientUtil.httpsRequest(query,"POST", JSONObject.toJSONString(payRequestBody),header);
+        }
+        Result result = JSONObject.parseObject(ret, Result.class);
+        log.info(" 查询返回数据:》》》 {}", result);
+        if(null != result){
+            if(result.isSuccess()){
+                JSONObject jsonResult = (JSONObject) result.getData();
+                return Result.success(jsonResult);
+            }
+        }else{
+            throw new ServiceException(-1,"操作失败[未查到支付信息]!");
+        }
+        return result;
+    }*/
+
+
+}

+ 858 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/impl/OrderServiceImpl.java

@@ -0,0 +1,858 @@
+package com.poyee.auctionorder.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.poyee.auctionorder.dto.*;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.auctionorder.mapper.AuctionOrderMapper;
+import com.poyee.auctionorder.mq.MqService;
+import com.poyee.auctionorder.mq.dto.PointOrderInfo;
+import com.poyee.auctionorder.service.IAuctionOrderListService;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.OrderBaseInfoDto;
+import com.poyee.base.dto.Pays;
+import com.poyee.base.dto.Result;
+import com.poyee.base.entity.UserBankInfo;
+import com.poyee.base.service.IUserBankInfoService;
+import com.poyee.base.service.SysBaseService;
+import com.poyee.base.service.impl.BaseServiceImpl;
+import com.poyee.common.constant.Constants;
+import com.poyee.common.exception.ServiceException;
+import com.poyee.courier.dto.entry.AuctionCourierOrderEntry;
+import com.poyee.courier.service.IOrderCourierRecordService;
+import com.poyee.mq.MqConstans;
+import com.poyee.util.DateUtils;
+import com.poyee.util.IpUtils;
+import com.poyee.util.RandomUtil;
+import com.poyee.util.http.HttpClientUtil;
+import com.tzy.sportcard.api.dto.ResourceData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ *
+ */
+@Slf4j
+@Service
+public class OrderServiceImpl extends BaseServiceImpl<AuctionOrderMapper, AuctionOrder, AuctionOrderDto> implements OrderService {
+
+    @Value("${pay.unified:http://localhost:8082/pay/p1/unified}")
+    private String unified;
+    @Value("${pay.walletInfo:http://localhost:8082/pay/p1/sycnWalletInfo}")
+    private String walletInfo;
+    @Value("${pay.query:http://localhost:8082/pay/p1/query}")
+    private String query;
+    @Value("${pay.refund:http://localhost:8082/pay/p1/refund}")
+    private String refund;
+    @Value("${auc.internal_lot:http://auction-auc/internal/lot/paid}")
+    private String internalLot;
+    @Value("${recharge.sycnWalletInfo:http://localhost:8082/pay/p1/sycnWalletInfo}")
+    private String sycnWalletInfoUrl;//同步接口
+    @Autowired
+    @Qualifier("threadPoolTaskExecutor")
+    private ThreadPoolTaskExecutor pools;
+    @Autowired
+    private MqService mqService;
+    @Autowired
+    private SysBaseService sysBaseService;
+    @Autowired
+    private IAuctionOrderListService auctionOrderListService;
+    @Autowired
+    private IOrderCourierRecordService orderCourierRecordService;
+    @Autowired
+    private IUserBankInfoService userBankInfoService;
+
+    /**
+     * 创建订单
+     *
+     * @param auctionOrderDto
+     * @return
+     */
+    @Override
+    public Result createOrder(AuctionOrderDto auctionOrderDto) {
+        AuctionOrder auctionOrder = new AuctionOrder();
+        try {
+            BeanUtils.copyProperties(auctionOrder, auctionOrderDto);
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        boolean save = save(auctionOrder);
+        if (save) {
+            Result<AuctionOrderDto> info = info(auctionOrder.getId());
+            AuctionOrderDto retEntity = info.getData();
+            //保存子表信息
+            List<AuctionOrderList> goods = auctionOrderDto.getGoods();
+//            BigDecimal totalPrice = new BigDecimal(0);
+            final StringBuffer[] stb = {new StringBuffer()};
+            final String[] eventId = {""};
+            if (null != goods && goods.size() > 0) {
+                goods.forEach(good -> {
+                    good.setOrderId(retEntity.getId());
+                    good.setOrderNo(retEntity.getOrderNo());
+                    good.setMerchantId(retEntity.getShopId());
+                    good.setUserId(retEntity.getAccountId());
+                    good.setEventId(StringUtils.isEmpty(auctionOrder.getEventId()) ? good.getGoodsId() : auctionOrder.getEventId());
+                    if (null == good.getTotalAmount()) {
+                        throw new ServiceException("价格为空!");
+                    }
+                    stb[0] = stb[0].append(good.getName()).append("*").append(good.getNum()).append(",");
+//                    totalPrice.add(good.getTotalAmount());
+                    eventId[0] = good.getGoodsId();
+                });
+                auctionOrderListService.saveBatch(goods);
+                if (StringUtils.isEmpty(auctionOrder.getEventId())) {
+                    //如果拍品id为空则取goods的id
+                    auctionOrder.setEventId(eventId[0]);
+                }
+                if (StringUtils.isEmpty(auctionOrder.getAuctionName())) {
+                    //如果 拍品名称为空 则 设置商品的名称
+                    auctionOrder.setAuctionName(stb[0].toString());
+                    updateById(auctionOrder);
+                }
+            }
+            return Result.ok(retEntity);
+        }
+        return Result.error("创建订单失败[001]!");
+    }
+
+    /**
+     * 创建订单
+     *
+     * @param auctionOrderDto
+     * @return
+     */
+    @Override
+    public Result createToPay(AuctionOrderDto auctionOrderDto) {
+        Result order = createOrder(auctionOrderDto);
+        if (order.isSuccess()) {
+            AuctionOrderDto data = (AuctionOrderDto) order.getData(AuctionOrderDto.class);
+            //如果下单成功
+            Result result = pay(new OrderBayInfoEntry(data.getId(), data.getPaymentType(), data.getOrderType()));
+            if (result.isSuccess()) {
+                result.addData("orderInfo", data);
+            }
+            return result;
+        }
+        return order;
+    }
+
+    /**
+     * 创建订单[钱包充值]
+     *
+     * @param rechargeOrderDto
+     * @return
+     */
+    @Override
+    public Result createToRecharge(RechargeOrderDto rechargeOrderDto) {
+        AuctionOrderDto auctionOrderDto = new AuctionOrderDto();
+        AppBaseUser appUserInfo = getAppUserInfo();
+        try {
+            BeanUtils.copyProperties(auctionOrderDto, rechargeOrderDto);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+        if (StringUtils.isNotEmpty(rechargeOrderDto.getAccountType()) && "merchant".equals(rechargeOrderDto.getAccountType())) {
+            //设置商家id
+            auctionOrderDto.setShopId(getAppUserMerchantId());
+        } else {//如果不是商家提现
+            auctionOrderDto.setAccountId(appUserInfo.getId());
+        }
+        String goodsName = "";
+        String orderNo = "";
+        //判断订单类型
+        if ("recharge".equals(auctionOrderDto.getOrderCategory())) {//充值
+            //判断用户是否是高频支付用户
+            List<Pays> pays = appUserInfo.getPays();
+            if(null == pays || pays.isEmpty()){
+                throw new ServiceException(-1, "操作失败[未达到充值标准]!");
+            }
+            goodsName = "钱包充值";
+            orderNo = RandomUtil.getRandom(RandomUtil.RECHARGE);
+            //查询钱包余额
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+            JSONObject param = new JSONObject();
+            param.put("type", rechargeOrderDto.getOrderType());
+//            param.put("payWay",rechargeOrderDto.getPayWay());
+            param.put("payWay", "recharge-baofoo");
+            param.put("userId", appUserInfo.getId());
+            String ret = null;
+            if (walletInfo.startsWith("https:")) {
+                ret = HttpClientUtil.httpsRequest(walletInfo, "POST", JSONObject.toJSONString(param), header);
+            } else {
+                ret = HttpClientUtil.httpRequest(walletInfo, "POST", JSONObject.toJSONString(param), header);
+            }
+            Result result = JSONObject.parseObject(ret, Result.class);
+            log.info(" 查询返回数据:》》》 {}", result);
+            if (null != result) {
+                if (result.isSuccess()) {
+                    try {
+                        String balance = String.valueOf(result.get("balance"));
+                        if (StringUtils.isNotEmpty(balance)) {
+                            BigDecimal i = new BigDecimal(balance);
+                            //查询钱包充值记录
+                            BigDecimal totalPrice = baseMapper.selectOrderPriceSum(appUserInfo.getId(), "recharge", "recharge-baofoo");
+                            if(totalPrice.compareTo(Constants.BIG_ONE_HUNDRED) >= 0){
+                                throw new ServiceException(-1, "充值失败!钱包余额消费限额为100000元/年");
+                            }
+                            //判断充值总额
+                            if ((null != totalPrice && null != auctionOrderDto.getTotalPrice()
+                                    && totalPrice.add(auctionOrderDto.getTotalPrice()).compareTo(Constants.BIG_ONE_HUNDRED) > 0)) {
+                                //未达到充值总额
+                                if (Constants.BIG_TEN_THOUSAND.compareTo(i.add(auctionOrderDto.getTotalPrice())) >= 0) {
+                                    throw new ServiceException(-1, "充值失败!您当前钱包可充值额度为[" + Constants.BIG_ONE_HUNDRED.subtract(totalPrice) + "]");
+                                }
+                                //可充值金额
+                                BigDecimal rechargeablePrice = Constants.BIG_TEN_THOUSAND.subtract(i).compareTo(Constants.BIG_ONE_HUNDRED.subtract(totalPrice)) > 0 ? Constants.BIG_ONE_HUNDRED.subtract(totalPrice) : Constants.BIG_TEN_THOUSAND.subtract(i);
+                                throw new ServiceException(-1, "充值失败!您当前钱包可充值额度为[" + rechargeablePrice + "]");
+                            }
+                            //判断余额是否符合
+                            if(Constants.BIG_TEN_THOUSAND.compareTo(i.add(auctionOrderDto.getTotalPrice())) < 0){
+                                throw new ServiceException(-1, "充值失败!您当前钱包可充值额度为[" + Constants.BIG_TEN_THOUSAND.subtract(i) + "]");
+                            }
+                        }
+                    } catch (Exception e) {
+                        log.error(" 获取余额信息异常! ,{}", e);
+                        throw new ServiceException(-1, StringUtils.isNotEmpty(e.getMessage()) ? e.getMessage() : "操作失败[获取余额信息异常]!");
+                    }
+                } else {
+                    throw new ServiceException(-1, result.getMsg());
+                }
+            } else {
+                throw new ServiceException(-1, "操作失败[未查到开户信息]!");
+            }
+        } else if ("withdraw".equals(auctionOrderDto.getOrderCategory())) {//提现
+            goodsName = "钱包提现";
+            orderNo = RandomUtil.getRandom(RandomUtil.RECHARGE_WITHDRAW);
+            //近14天可提现1次 根据配置
+            String cycle = sysBaseService.selectDictValue("withdraw_config", "cycle");//周期
+            String times = sysBaseService.selectDictValue("withdraw_config", "times");//次数
+            if(StringUtils.isEmpty(cycle) || StringUtils.isEmpty(times)){
+                throw new ServiceException(-1, "提现失败[401]!");
+            }
+            //查询是否符合资格
+            AuctionOrder auctionOrder = new AuctionOrder();
+            auctionOrder.setOrderCategory("withdraw");//提现
+            auctionOrder.setStatus(101);//提现成功
+            //指定时间
+            Date date = DateUtils.addCalendar(new Date(), DateUtils.day, -Integer.parseInt(cycle));
+            //查询指定条件范围内的数据
+            QueryWrapper<AuctionOrder> auctionOrderQueryWrapper = checkWrapper(auctionOrder, true)
+                    .gt("create_time",date)
+                    .orderBy(false,false,"id")
+                    ;
+            Result<AuctionOrderDto> dtoResult = listPage(auctionOrderQueryWrapper, auctionOrder);
+//            Result<AuctionOrderDto> dtoResult = getOneDto(auctionOrder, true, "id", false);
+            if (dtoResult.isSuccess()) {
+                List<AuctionOrderDto> dataList = dtoResult.getDataList();
+//                AuctionOrderDto dtoData = dtoResult.getData();
+                if(null != dataList && dataList.size() > 0){
+                    if(dataList.size() >= Integer.parseInt(times) ){
+                        int wtimes = Integer.parseInt(times) - dataList.size();
+                        wtimes = wtimes < 0 ? 0 : wtimes;
+                        return Result.error("提现失败!近" + cycle + "日内可提现" + wtimes + "次")
+                                .put("lastWithdrawTime",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dataList.get(0).getCreateTime()));
+                    }
+                }
+            }
+        } else {
+            return Result.error("设置订单类型错误!");
+        }
+        auctionOrderDto.setOrderNo(orderNo);
+        auctionOrderDto.setAuctionName(goodsName);
+        auctionOrderDto.setPaymentType(rechargeOrderDto.getPayWay());
+        Result order = createOrder(auctionOrderDto);
+        if (order.isSuccess()) {
+            AuctionOrderDto data = (AuctionOrderDto) order.getData(AuctionOrderDto.class);
+            //如果下单成功
+            OrderBayInfoEntry orderBayInfoEntry = new OrderBayInfoEntry(data.getId(), data.getPaymentType(), data.getOrderType());
+            orderBayInfoEntry.setBankId(rechargeOrderDto.getBankId());
+            orderBayInfoEntry.setType(rechargeOrderDto.getType());
+            orderBayInfoEntry.setOrderCategory(auctionOrderDto.getOrderCategory());
+            orderBayInfoEntry.setAccountType(rechargeOrderDto.getAccountType());
+            Result result = pay(orderBayInfoEntry);
+            if (result.isSuccess()) {
+                result.addData("orderInfo", data);
+            }
+            return result;
+        }
+        return Result.error();
+    }
+
+
+    /**
+     * 支付
+     *
+     * @param orderBayInfoEntry
+     * @return
+     */
+    @Override
+    public Result pay(OrderBayInfoEntry orderBayInfoEntry) {
+        Result<AuctionOrder> info = detail(orderBayInfoEntry.getId());
+        if (info.isSuccess()) {
+            AuctionOrder auctionOrderDto = info.getData();
+//            AuctionOrder auctionOrderDto = info.getData(AuctionOrder.class);
+            //计算需要支付的金额(商品订单金额+运费-优惠券)
+            BigDecimal totalPrice = auctionOrderDto.getTotalPrice();
+            if (null == totalPrice) {
+                return Result.error("订单支付金额异常,请确认订单金额!");
+            }
+            if (null != orderBayInfoEntry.getAddressId() && 0 != orderBayInfoEntry.getAddressId()) {
+                //保存订单的物流信息
+                AuctionCourierOrderEntry entry = new AuctionCourierOrderEntry();
+                entry.setId(orderBayInfoEntry.getId());
+                entry.setAddressId(orderBayInfoEntry.getAddressId());
+                entry.setOrderNo( auctionOrderDto.getOrderNo());
+                entry.setOrderType( auctionOrderDto.getOrderType());
+                entry.setAccountId(auctionOrderDto.getAccountId());
+                entry.setFreightAmount(auctionOrderDto.getFreightAmount());
+                entry.setShopId(auctionOrderDto.getShopId());
+                Result orderCourierRecord = orderCourierRecordService.holdOrderCourierRecord(entry);
+                if (!orderCourierRecord.isSuccess()) {
+                    return orderCourierRecord;
+                }
+            }
+            if (null != auctionOrderDto && StringUtils.isNotEmpty(auctionOrderDto.getPaymentType())
+                    && auctionOrderDto.getPaymentType().equals(orderBayInfoEntry.getPayType()) && StringUtils.isNotEmpty(auctionOrderDto.getPayData())
+            ) {
+                //判断支付时间是否当前时间 如果是 则重新生成订单
+                if (new Date().before(auctionOrderDto.getPaymentTime())) {
+                    return Result.ok(JSONObject.parseObject(auctionOrderDto.getPayData()));
+                }
+            }
+            BigDecimal freightAmount = null == auctionOrderDto.getFreightAmount() ? new BigDecimal(0) : auctionOrderDto.getFreightAmount();
+            BigDecimal discount = null == auctionOrderDto.getDiscount() ? new BigDecimal(0) : auctionOrderDto.getDiscount();
+            BigDecimal parPrice = totalPrice.add(freightAmount).subtract(discount);
+            JSONObject payRequestBody = new JSONObject();
+            payRequestBody.put("userType", "APP");
+            payRequestBody.put("category", orderBayInfoEntry.getCategory());//支付模块
+            payRequestBody.put("orderCategory", orderBayInfoEntry.getOrderCategory());//支付模块
+            payRequestBody.put("orderNo", auctionOrderDto.getOrderNo()); //订单编码
+            payRequestBody.put("totalAmount", parPrice);//支付金额
+            payRequestBody.put("body", StringUtils.isEmpty(auctionOrderDto.getAuctionName()) ? "球星卡片" : auctionOrderDto.getAuctionName());//支付商品描述
+            payRequestBody.put("payWay", orderBayInfoEntry.getPayType()); //支付方式
+            payRequestBody.put("createip", IpUtils.getHostIp()); //请求ip
+            payRequestBody.put("createOrderTime", auctionOrderDto.getCreateTime()); //订单创建时间
+            if (Constants.rechargeOrderType.contains(orderBayInfoEntry.getOrderCategory())) {
+                setRechargeInfo(payRequestBody, orderBayInfoEntry, null);
+            }
+            Date expireTime = (null == auctionOrderDto.getPayTimeLimit() || auctionOrderDto.getPayTimeLimit().before(new Date())) ? DateUtils.addCalendar(new Date(), DateUtils.day, 3) : auctionOrderDto.getPayTimeLimit();
+            //如果没有支付过期时间 则默认3天后过期
+            payRequestBody.put("expireTime", expireTime);//订单过期时间 如果为空则设置为付款期限
+            try {
+                String ret = null;
+                if (unified.contains("http:")) {
+                    ret = HttpClientUtil.httpRequestJSON(unified, "POST", JSONObject.toJSONString(payRequestBody), null);
+                } else {
+                    Map<String, String> header = new HashMap<>();
+                    header.put("Content-Type", "application/json");
+                    ret = HttpClientUtil.httpsRequest(unified, "POST", JSONObject.toJSONString(payRequestBody), header);
+                }
+                Result result = JSONObject.parseObject(ret, Result.class);
+                log.info(" 下单返回数据:》》》 {}", result);
+                if (null != result) {
+                    if (result.isSuccess()) {
+                        //更新订单信息
+                        auctionOrderDto.setPaymentType(orderBayInfoEntry.getPayType());//支付方式
+                        auctionOrderDto.setPaymentSubType(result.getString("paymentSubType"));//支付子类型
+                        auctionOrderDto.setPayData(JSONObject.toJSONString(result.getResult()));//支付参数
+                        auctionOrderDto.setTradeNo(String.valueOf(result.getResult().get("merOrderId")));//支付编码
+                        auctionOrderDto.setPaymentTime(new Date());
+                        auctionOrderDto.setStatus(100);//待付款
+                        boolean b = updateById(auctionOrderDto);
+                        log.info(" 支付下单 更新订单信息:{} ", b);
+                        Map map = result.getResult();
+                        map.remove("paymentSubType");
+                        if ("recharge".equals(orderBayInfoEntry.getCategory())) {
+                            JSONObject jsonResult = (JSONObject) result.getResult().get("result");
+                            jsonResult.remove("payParam");
+                            map.putAll(jsonResult);
+                        }
+                        result.setResult(null);
+                        result.setData(map);
+                    }
+                    return result;
+                } else {
+                    throw new ServiceException(-1, "支付下单失败[001]!");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException(-1, "系统错误,支付下单失败!");
+            }
+        }
+        return info;
+    }
+
+    private void setRechargeInfo(JSONObject payRequestBody, OrderBayInfoEntry orderBayInfoEntry, Integer merchantId) {
+        //获取机构/平台号 默认 HS
+        if (null == merchantId) {
+            merchantId = Integer.valueOf(sysBaseService.selectDictValue("baofoo_recharge_default", "merchantId"));
+        }
+        if (null == merchantId) {
+            throw new ServiceException(-1, "支付下单失败[004]!");
+        }
+        payRequestBody.put("merchantId", merchantId);
+        JSONObject userInfo = new JSONObject();
+        UserBankInfo bankInfo = userBankInfoService.getById(orderBayInfoEntry.getBankId());
+        userInfo.put("agreementNo", bankInfo.getMsgId());
+        userInfo.put("loginNo", bankInfo.getAccount());
+        userInfo.put("customerType", StringUtils.isNotEmpty(orderBayInfoEntry.getAccountType()) ? orderBayInfoEntry.getAccountType().toUpperCase() : orderBayInfoEntry.getAccountType());
+        payRequestBody.put("rechargeUserInfoDto", userInfo);
+    }
+
+    /**
+     * 支付成功回调
+     *
+     * @param resourceData
+     * @return
+     */
+    @Override
+    public Result payBackOrder(ResourceData resourceData) {
+        String out_trade_no = resourceData.getOut_trade_no();
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setTradeNo(out_trade_no);
+        //判断是否已经支付成功
+        auctionOrder = getOne(checkWrapper(auctionOrder, false), false);
+        if (null != auctionOrder) {
+            if (101 == auctionOrder.getStatus() || (101 != auctionOrder.getStatus() && Constants.TRADE_SUCCESS_EN.equals(auctionOrder.getPaymentStatus()))) {
+                return Result.success();
+            }
+            auctionOrder.setPaymentSuccessTime(DateUtils.parseDate(resourceData.getSuccess_time()));
+            auctionOrder.setStatus(101);//101 支付成功
+            auctionOrder.setPaymentMsg(JSONObject.toJSONString(resourceData));
+            auctionOrder.setPaymentStatus(resourceData.getTrade_state());
+            auctionOrder.setPaymentNum(resourceData.getTransaction_id());
+            auctionOrder.setActualPayable(new BigDecimal(resourceData.getAmount().getPayer_total()).divide(new BigDecimal(100)));
+            boolean b = updateById(auctionOrder);
+            if (b) {
+                //添加财务对账
+                AuctionOrder finalAuctionOrder = auctionOrder;
+                Thread t = new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+                            OrderBaseInfoDto orderBaseInfoDto = new OrderBaseInfoDto();
+                            BeanUtils.copyProperties(orderBaseInfoDto, finalAuctionOrder);
+                            orderBaseInfoDto.setMerchantId(Long.valueOf(finalAuctionOrder.getShopId()));//商家id
+                            orderBaseInfoDto.setTradeNo(finalAuctionOrder.getTradeNo());//tradeNo
+                            orderBaseInfoDto.setUserId(Long.valueOf(finalAuctionOrder.getAccountId()));//用户id
+                            orderBaseInfoDto.setPaymentSubType(finalAuctionOrder.getPaymentSubType());//支付子类型
+                            orderBaseInfoDto.setPaymentType(finalAuctionOrder.getPaymentType());//支付类型
+                            orderBaseInfoDto.setActualPayment(finalAuctionOrder.getActualPayable());//实付金额
+                            orderBaseInfoDto.setAccountsPayable(finalAuctionOrder.getTotalPrice());//应付金额
+                            orderBaseInfoDto.setPurchaseCount(Long.valueOf(finalAuctionOrder.getNum()));//数量
+                            sysBaseService.insertSysFinceByOrder(orderBaseInfoDto, "支付");
+                            //拍品支付回传
+                            AuctionOrderList auctionOrderList = new AuctionOrderList();
+                            auctionOrderList.setOrderId(Math.toIntExact(orderBaseInfoDto.getId()));
+                            List<AuctionOrderListDto> list = auctionOrderListService.list(auctionOrderList);
+                            log.info(" 查询子表数据:{}", list);
+                            if (null != list && list.size() > 0) {
+                                List<String> collect = list.stream().map(item -> {
+                                    AuctionOrderListDto auctionOrderListDto = JSONObject.parseObject(JSONObject.toJSONString(item), AuctionOrderListDto.class);
+                                    return auctionOrderListDto.getGoodsId();
+                                }).collect(Collectors.toList());
+                                JSONArray array = (JSONArray) JSONArray.toJSON(collect);
+                                log.info("  传入数据:{}", array);
+                                String ret = HttpClientUtil.httpRequestJSON(internalLot, "POST", JSONArray.toJSONString(array), null);
+                                log.info(" 请求接口:{} 返回结果:{}", internalLot, ret);
+                            }
+                            /*JSONArray array = new JSONArray();
+                            array.add(finalAuctionOrder.getEventId());
+                            String ret = HttpClientUtil.httpRequestJSON(internalLot, "POST", JSONArray.toJSONString(array), null);
+                            log.info(" 请求接口:{} 返回结果:{}",internalLot,ret);*/
+                        } catch (IllegalAccessException e) {
+                            e.printStackTrace();
+                        } catch (InvocationTargetException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                };
+                pools.execute(t);
+                return Result.ok("操作成功");
+            }
+        }
+        return Result.error("更新出错!");
+    }
+
+    /**
+     * 保存钱包消费记录
+     *
+     * @param resourceData
+     * @return
+     */
+    public Result rechargeExpendCallBack(ResourceData resourceData) {
+        String out_trade_no = resourceData.getOut_trade_no();
+        AuctionOrder auctionOrder = selectGroupOrderInfo(out_trade_no);
+        String orderCategory = "未知";
+        if ("PAY".equals(resourceData.getTrade_state())) {
+            orderCategory = "expend";
+            auctionOrder.setPaymentNum(resourceData.getTransaction_id());
+        } else if ("REFUND".equals(resourceData.getTrade_state())) {
+            orderCategory = "income";
+            auctionOrder.setAuctionName("退款");
+            auctionOrder.setOrderNo(out_trade_no);
+            auctionOrder.setRefundNo(out_trade_no);
+        }
+        //如果查询到数据
+        if (null != auctionOrder) {
+            auctionOrder.setStatus(null);
+            Result<AuctionOrderDto> oneDto = getOneDto(auctionOrder);
+            if ("PAY".equals(resourceData.getTrade_state())) {
+                auctionOrder.setPaymentMsg(JSONObject.toJSONString(resourceData));
+            } else if ("REFUND".equals(resourceData.getTrade_state())) {
+                auctionOrder.setRefundMsg(JSONObject.toJSONString(resourceData));
+                auctionOrder.setRefundSuccessTime(new Date());
+            }
+            auctionOrder.setStatus(101);//操作成功
+            auctionOrder.setTradeNo(out_trade_no);
+            auctionOrder.setOrderType("recharge");
+            auctionOrder.setPayCategory(resourceData.getBank_type());
+            auctionOrder.setPaymentType("recharge");
+            auctionOrder.setOrderCategory(orderCategory);
+            auctionOrder.setTotalPrice(new BigDecimal(resourceData.getAmount().getTotal()).divide(Constants.big_one_hundred).setScale(BigDecimal.ROUND_FLOOR));
+            auctionOrder.setNum(1);
+            //判断是否已经有记录
+            if (oneDto.isSuccess()) {
+                AuctionOrderDto auctionOrderDto = oneDto.getData();
+                auctionOrder.setId(auctionOrderDto.getId());
+                log.info(" 更新钱包消费记录:{} ", auctionOrder);
+                updateById(auctionOrder);
+            } else {
+                log.info(" 添加钱包消费记录:{} ", auctionOrder);
+                save(auctionOrder);
+            }
+            saveOrUpdate(auctionOrder);
+            //同步用户钱包余额
+            Map<String, String> param = new HashMap<>();
+            param.put("type", "recharge");
+            param.put("payWay", resourceData.getSubPaymentType());
+            param.put("userId", String.valueOf(auctionOrder.getAccountId()));
+            //调用接口
+            String post = null;
+            if (sycnWalletInfoUrl.contains("http:")) {
+                post = HttpClientUtil.httpRequestJSON(sycnWalletInfoUrl, "POST", JSONObject.toJSONString(param), null);
+            } else {
+                Map<String, String> header = new HashMap<>();
+                header.put("Content-Type", "application/json");
+                post = HttpClientUtil.httpsRequest(sycnWalletInfoUrl, "POST", JSONObject.toJSONString(param), header);
+            }
+            log.info(" 同步用户钱包余额结果:{} ", post);
+            return Result.ok();
+        } else {
+            return Result.error();
+        }
+    }
+
+    /**
+     * 退款
+     *
+     * @param orderBayInfoEntry
+     * @return
+     */
+    @Override
+    public Result refund(OrderBayInfoEntry orderBayInfoEntry) {
+        AuctionOrder auctionOrder = getById(orderBayInfoEntry.getId());//订单信息
+        //判断订单状态
+        if (Constants.refund_status.contains(auctionOrder.getStatus())) {
+            return Result.error("退款失败【" + sysBaseService.selectDictLabel("order_status", String.valueOf(auctionOrder.getStatus())) + "】!");
+        }
+        Result queryInfo = Result.error();
+        if (((auctionOrder.getActualPayable() == null || Constants.big_zero.compareTo(auctionOrder.getActualPayable()) == 0)
+                && auctionOrder.getPoint() > 0)) {
+            queryInfo = Result.success();
+        } else {
+            queryInfo = queryPayInfo(auctionOrder);
+        }
+        if (queryInfo.isSuccess()) {
+            if (Constants.refund_freight.equals(orderBayInfoEntry.getRefundType()) &&
+                    (null == auctionOrder.getFreightAmount() || Constants.big_zero.compareTo(auctionOrder.getFreightAmount()) > -1)) {
+                return Result.error("退款失败【该订单无快递费可退】请确认订单信息!");
+            }
+            if (Constants.refund_order.equals(orderBayInfoEntry.getRefundType()) &&
+                    (null == auctionOrder.getActualPayable() || Constants.big_zero.compareTo(auctionOrder.getActualPayable()) == 0)) {
+                return Result.error("退款失败【该订单无费用可退】请确认订单信息!");
+            }
+            //进行退款
+            BigDecimal refundFee = Constants.big_zero;
+            //如果退款金额为空 则直接退订单可退金额
+            BigDecimal actualPayable = null != auctionOrder.getActualPayable() ? auctionOrder.getActualPayable() : Constants.big_zero;//实际支付金额
+            BigDecimal freightAmount = null != auctionOrder.getFreightAmount() ? auctionOrder.getFreightAmount() : Constants.big_zero;//快递费
+            BigDecimal refundFeed = null == auctionOrder.getRefundFee() ? Constants.big_zero : auctionOrder.getRefundFee();//已退款金额
+            //传入退款金额
+            BigDecimal inRefundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? Constants.big_zero : new BigDecimal(orderBayInfoEntry.getRefundFee());
+            //如果退运费
+            if (Constants.refund_freight.equals(orderBayInfoEntry.getRefundType())) {
+                refundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? freightAmount : inRefundFee;
+            } else
+                //如果退订单
+                if (Constants.refund_order.equals(orderBayInfoEntry.getRefundType())) {
+                    refundFee = StringUtils.isEmpty(orderBayInfoEntry.getRefundFee()) ? actualPayable.subtract(refundFeed) : inRefundFee;
+                    if (refundFee.compareTo(actualPayable.subtract(refundFeed)) > 1) {
+                        return Result.error("退款失败【超过该订单可退金额:" + actualPayable.subtract(refundFeed) + "】请确认订单信息!");
+                    }
+                } else // if(Constants.refund_order.equals(orderBayInfoEntry.getRefundType())) //如果 全部退款:包含订单和快递费
+                {
+                    //如果 全部退款:包含订单和快递费(默认) 直接退款,不取所传金额
+                    refundFee = actualPayable.subtract(refundFeed).add(freightAmount);
+                }
+            //如果是保证金订单 退回保证金及积分
+            boolean refundPoint = false;
+            if (null != auctionOrder.getPoint() && 0 != auctionOrder.getPoint()) {
+                changeUserPoint(auctionOrder, auctionOrder.getPoint() * 100);
+                refundPoint = true;
+            }
+            //退款操作 1 > 0 = -1 <
+            if (Constants.big_zero.compareTo(refundFee) > -1) {
+                if (refundPoint) {
+                    auctionOrder.setStatus(205);//已经完全退款
+                    auctionOrder.setRefundSuccessTime(new Date());
+                    boolean b = updateById(auctionOrder);
+                    return Result.success("已完成退款!");
+                }
+                return Result.error("退款失败【该订单无可退金额:" + refundFee + "】请确认订单信息!");
+            }
+            //调用接口查询是否已经支付成功
+            JSONObject refundRequestBody = new JSONObject();
+            refundRequestBody.put("payWay", auctionOrder.getPaymentSubType()); //支付方式
+            refundRequestBody.put("orderNo", auctionOrder.getTradeNo());//支付编码
+            refundRequestBody.put("refundAmount", refundFee);//需要退款金额
+            refundRequestBody.put("refundMsg", orderBayInfoEntry.getRefundMsg());//退款描述
+            String ret = null;
+            if (refund.contains("http:")) {
+                ret = HttpClientUtil.httpRequestJSON(refund, "POST", JSONObject.toJSONString(refundRequestBody), null);
+            } else {
+                Map<String, String> header = new HashMap<>();
+                header.put("Content-Type", "application/json");
+                ret = HttpClientUtil.httpsRequest(refund, "POST", JSONObject.toJSONString(refundRequestBody), header);
+            }
+            Result result = JSONObject.parseObject(ret, Result.class);
+            log.info(" 退款返回数据:》》》 {}", result);
+            if (null != result) {
+                if (result.isSuccess()) {
+                    Map map = result.getResult();
+                    JSONObject jsonResult = new JSONObject(map);
+                    //根据退款状态修改订单状态:
+                    JSONObject data = jsonResult.getJSONObject("data");
+                    String refundChange = data.getString("fund_change");
+                    /*if(!Constants.refund_order.equals(orderBayInfoEntry.getRefundType())){
+                        //退款配送费
+//                        auctionOrder.setFreightAmount(freightAmount.subtract(refundFee));
+                    }*/
+                    auctionOrder.setRefundStatus(data.getString("refund_status"));//退款状态
+                    auctionOrder.setRefundFee(refundFeed.add(refundFee));//总退款金额
+                    auctionOrder.setRefundNo(data.getString("out_refund_no"));
+                    auctionOrder.setRefundTime(new Date());
+                    auctionOrder.setRefundMsg(StringUtils.isNotEmpty(auctionOrder.getMsg()) ? auctionOrder.getMsg() + "," + data.toJSONString() : data.toJSONString());//退款返回数据
+                    if (refundChange.equals("Y")) {//退款操作成功
+                        if (auctionOrder.getRefundFee().compareTo(actualPayable) == 0) {
+                            auctionOrder.setStatus(205);//已经完全退款
+                            auctionOrder.setRefundSuccessTime(new Date());
+                        }
+                    } else if (refundChange.equals("P")) {//退款中,等待退款回调
+                        auctionOrder.setStatus(204);//退款中
+                    }
+                    boolean b = updateById(auctionOrder);
+                    if (b && refundChange.equals("Y")) {
+                        //财务对账记录
+                        AuctionOrder finalAuctionOrder = auctionOrder;
+                        Thread t = new Thread() {
+                            @Override
+                            public void run() {
+                                try {
+                                    OrderBaseInfoDto orderBaseInfoDto = new OrderBaseInfoDto();
+                                    BeanUtils.copyProperties(orderBaseInfoDto, finalAuctionOrder);
+                                    orderBaseInfoDto.setMerchantId(Long.valueOf(finalAuctionOrder.getShopId()));//商家id
+                                    orderBaseInfoDto.setTradeNo(finalAuctionOrder.getTradeNo());//tradeNo
+                                    orderBaseInfoDto.setUserId(Long.valueOf(finalAuctionOrder.getAccountId()));//用户id
+                                    orderBaseInfoDto.setPaymentSubType(finalAuctionOrder.getPaymentSubType());//支付子类型
+                                    orderBaseInfoDto.setPaymentType(finalAuctionOrder.getPaymentType());//支付类型
+                                    orderBaseInfoDto.setActualPayment(finalAuctionOrder.getActualPayable());//实付金额
+                                    orderBaseInfoDto.setAccountsPayable(finalAuctionOrder.getTotalPrice());//应付金额
+                                    orderBaseInfoDto.setPurchaseCount(Long.valueOf(finalAuctionOrder.getNum()));//数量
+                                    orderBaseInfoDto.setOutRefundNo(data.getString("out_refund_no"));
+                                    sysBaseService.insertSysFinceByOrder(orderBaseInfoDto, "退款");
+                                    //如果是保证金订单 退回保证金及积分
+                                    /*if(null != auctionOrder.getPoint() && 0 != auctionOrder.getPoint()){
+                                        changeUserPoint(auctionOrder,auctionOrder.getPoint());
+                                    }*/
+                                } catch (IllegalAccessException e) {
+                                    e.printStackTrace();
+                                } catch (InvocationTargetException e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        pools.execute(t);
+                    }
+                    return Result.success("操作成功!");
+                }
+                return Result.success(result.getMsg());
+            } else {
+                throw new ServiceException(-1, "退款失败[未查到支付信息]!");
+            }
+        } else {
+            if ("TRADE_REFUND".equals(queryInfo.getMsg())) {
+                //已经退款
+                auctionOrder.setStatus(205);//已经完全退款
+                boolean b = updateById(auctionOrder);
+                log.info(" 已经完成退款>>{} ", auctionOrder);
+                return Result.success("已完成退款[000]!");
+            }
+            return queryInfo;
+        }
+    }
+
+    /**
+     * 用户积分变更
+     *
+     * @param auctionOrder
+     * @param point        负为扣除,正为增加
+     */
+    @Override
+    public void changeUserPoint(AuctionOrder auctionOrder, int point) {
+        //扣除用户积分到拍卖积分订单
+        PointOrderInfo orderInfo = new PointOrderInfo();
+        orderInfo.setId(Long.valueOf(auctionOrder.getId()));
+        orderInfo.setUserId(Long.valueOf(auctionOrder.getAccountId()));
+        orderInfo.setOrderNo(auctionOrder.getOrderNo());
+        mqService.sendPointMq(orderInfo, MqConstans.POINT_AUCTION, point);
+    }
+
+    /**
+     * 查询订单支付情况
+     *
+     * @param auctionOrder
+     * @return
+     */
+    private Result queryPayInfo(AuctionOrder auctionOrder) {
+        //调用接口查询是否已经支付成功
+        JSONObject payRequestBody = new JSONObject();
+        payRequestBody.put("payWay", auctionOrder.getPaymentSubType()); //支付方式
+        payRequestBody.put("orderNo", auctionOrder.getTradeNo());//支付编码
+        String ret = null;
+        if (query.contains("http:")) {
+            ret = HttpClientUtil.httpRequestJSON(query, "POST", JSONObject.toJSONString(payRequestBody), null);
+        } else {
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+            ret = HttpClientUtil.httpsRequest(query, "POST", JSONObject.toJSONString(payRequestBody), header);
+        }
+        Result result = JSONObject.parseObject(ret, Result.class);
+        log.info(" 查询返回数据:》》》 {}", result);
+        if (null != result) {
+            if (result.isSuccess()) {
+                JSONObject jsonResult = (JSONObject) result.getData();
+                return Result.success(jsonResult);
+            }
+        } else {
+            throw new ServiceException(-1, "操作失败[未查到支付信息]!");
+        }
+        return result;
+    }
+
+    /**
+     * 查询钱包订单列表
+     *
+     * @param orderBaseEntity
+     * @return
+     */
+    public Result searchRechargeOrders(OrderBaseEntity orderBaseEntity) {
+        AuctionOrder auctionOrder = new AuctionOrder();
+        try {
+            BeanUtils.copyProperties(auctionOrder, orderBaseEntity);
+        } catch (Exception e) {
+            log.error(" 设置参数异常:{} ", e);
+        }
+        boolean checkUser = true;
+        if ("merchant".equals(orderBaseEntity.getAccountType())) {
+            auctionOrder.setShopId(getAppUserMerchantId());
+            checkUser = false;
+        }
+        auctionOrder.setSord("desc");
+        auctionOrder.setSidx("create_time");
+        if ("expend".equals(auctionOrder.getOrderCategory()) || "withdraw".equals(auctionOrder.getOrderCategory())) {
+            auctionOrder.setOrderCategory(null);
+            QueryWrapper<AuctionOrder> auctionOrderQueryWrapper = checkWrapper(auctionOrder, true)
+                    .in("order_category", "expend", "withdraw");
+            return listPage(auctionOrderQueryWrapper, auctionOrder);
+        } else if ("income".equals(auctionOrder.getOrderCategory()) || "recharge".equals(auctionOrder.getOrderCategory())) {
+            auctionOrder.setOrderCategory(null);
+            QueryWrapper<AuctionOrder> auctionOrderQueryWrapper = checkWrapper(auctionOrder, true)
+                    .in("order_category", "recharge", "income");
+            return listPage(auctionOrderQueryWrapper, auctionOrder);
+        }
+        return listPage(auctionOrder, checkUser);
+    }
+
+    /**
+     * 查询钱包订单列表
+     *
+     * @param id
+     * @return
+     */
+    public Result searchOrderById(Integer id, boolean checkUser) {
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setId(id);
+        return getOneDto(auctionOrder, checkUser);
+    }
+
+    @Override
+    public AuctionOrder selectGroupOrderInfo(String tradeNo) {
+        return baseMapper.selectGroupOrderInfo(tradeNo);
+    }
+    //查询下次提现时间
+    @Override
+    public Result searchWithdrawalTime(){
+        //近14天可提现1次 根据配置
+        String cycle = sysBaseService.selectDictValue("withdraw_config", "cycle");//周期
+        String times = sysBaseService.selectDictValue("withdraw_config", "times");//次数
+        if(StringUtils.isEmpty(cycle) || StringUtils.isEmpty(times)){
+            throw new ServiceException(-1, "提现失败[401]!");
+        }
+        //查询是否符合资格
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setOrderCategory("withdraw");//提现
+        auctionOrder.setStatus(101);//提现成功
+        //指定时间
+        Date date = DateUtils.addCalendar(new Date(), DateUtils.day, -Integer.parseInt(cycle));
+        //查询指定条件范围内的数据
+        QueryWrapper<AuctionOrder> auctionOrderQueryWrapper = checkWrapper(auctionOrder, true)
+                .gt("create_time",date)
+                .orderBy(false,false,"id")
+                ;
+        Result<AuctionOrderDto> dtoResult = listPage(auctionOrderQueryWrapper, auctionOrder);
+        if (dtoResult.isSuccess()) {
+            List<AuctionOrderDto> dataList = dtoResult.getDataList();
+            if(null != dataList && dataList.size() > 0){
+                if(dataList.size() >= Integer.parseInt(times) ){
+                    Date nextDate = DateUtils.addCalendar(dataList.get(0).getCreateTime(), DateUtils.day, Integer.parseInt(cycle));
+                    return Result.error("提现失败!近" + cycle + "日内可提现" +(dataList.size() - Integer.parseInt(times)) + "次")
+                            .put("nextWithdrawTime",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, nextDate));
+                }
+            }
+        }
+        return Result.success();
+    }
+}

+ 155 - 0
auction-order/src/main/java/com/poyee/auctionorder/service/impl/VendingMachineOrderServiceImpl.java

@@ -0,0 +1,155 @@
+package com.poyee.auctionorder.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.poyee.auctionorder.dto.AuctionOrderListDto;
+import com.poyee.auctionorder.dto.OrderBayInfoEntry;
+import com.poyee.auctionorder.dto.OrderRefundInfoEntry;
+import com.poyee.auctionorder.dto.VendingMachineOrderDto;
+import com.poyee.auctionorder.entity.AuctionOrder;
+import com.poyee.auctionorder.entity.AuctionOrderList;
+import com.poyee.auctionorder.mapper.AuctionOrderMapper;
+import com.poyee.auctionorder.service.IAuctionOrderListService;
+import com.poyee.auctionorder.service.OrderService;
+import com.poyee.auctionorder.service.VendingMachineOrderService;
+import com.poyee.base.dto.Result;
+import com.poyee.base.service.SysBaseService;
+import com.poyee.base.service.impl.BaseServiceImpl;
+import com.poyee.common.constant.Constants;
+import com.poyee.courier.service.IOrderCourierRecordService;
+import com.poyee.util.BeanUtil;
+import com.poyee.util.http.HttpClientUtil;
+import com.poyee.util.security.Md5Utils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class VendingMachineOrderServiceImpl  extends BaseServiceImpl<AuctionOrderMapper, AuctionOrder, VendingMachineOrderDto> implements VendingMachineOrderService {
+
+    @Autowired
+    private IOrderCourierRecordService orderCourierRecordService;
+    @Autowired
+    private IAuctionOrderListService auctionOrderListService;
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private SysBaseService sysBaseService;
+    @Value("${vending.authUserName:BYSW}")
+    private String authUserName = "BYSW";
+    @Value("${vending.authPassword:Bysw12345}")
+    private String authPassword ="Bysw12345";
+    private String queryUrl="https://api.hycereson.com/api/v2/?auth_name={0}&sign={1}&timestamp={2}&api=get_custom_activity_product&params={3}";
+
+    @Override
+    public Result getById(Integer id){
+        Result<VendingMachineOrderDto> info = info(id);
+        if(info.isSuccess()){
+            VendingMachineOrderDto data = info.getData();
+            if(Constants.sendExpress_status.contains(data.getStatus())){
+                //如果订单是已经发货
+                data.setOrderCourierRecordDto(orderCourierRecordService.getByOrderIdAndOrderType(data.getId(),data.getOrderType()));
+                info = info.putDataJSON(data);
+            }
+        }
+        return info;
+    }
+
+    @Override
+    public Result refund(OrderRefundInfoEntry orderRefundInfoEntry){
+        //查询订单信息
+        AuctionOrder auctionOrder = new AuctionOrder();
+        auctionOrder.setOrderNo(orderRefundInfoEntry.getOrderNo());
+        Result<VendingMachineOrderDto> info = getOneDto(auctionOrder);
+//        Result<VendingMachineOrderDto> info = info(orderRefundInfoEntry.getId());
+        if(null != info && info.isSuccess()){
+            VendingMachineOrderDto dto = info.getData();
+            if(dto.getStatus() == 101){
+                //查询需要退款的商品
+                Map<String ,Object> params = new HashMap<>();
+                params.put("out_order_no",dto.getOrderNo());
+                Result result = searchRefundGoods(params);
+                if(result.isSuccess()){
+                    Map<String,Integer> successNums = (Map<String, Integer>) result.get("successNums");
+                    //计算金额
+                    AuctionOrderList auctionOrderList = new AuctionOrderList();
+                    auctionOrderList.setOrderId(dto.getId());
+//                    auctionOrderList.setOrderId(orderRefundInfoEntry.getId());
+                    List<AuctionOrderListDto> list = auctionOrderListService.list(auctionOrderList);
+                    final BigDecimal[] refundAmounts = {Constants.big_zero};
+                    if(null !=  list && list.size() > 0){
+                        list.forEach(item->{
+                            Integer nums = successNums.get(item.getGoodsId());
+                            Integer num = item.getNum();
+                            if(null != nums && null != num ){
+                                Integer refundNum = num - nums;
+                                if(refundNum > 0){
+                                    refundAmounts[0] = refundAmounts[0].add(new BigDecimal(refundNum).multiply(item.getAmount()));
+                                }
+                            }
+                        });
+                    }
+                    OrderBayInfoEntry orderBayInfoEntry = new OrderBayInfoEntry(dto.getId(),dto.getPaymentType(),dto.getOrderType());
+                    orderBayInfoEntry.setRefundFee(String.valueOf(refundAmounts[0]));
+                    orderBayInfoEntry.setRefundMsg(orderRefundInfoEntry.getRefundMsg());
+                    //如果没问题可以进行退款
+                    orderBayInfoEntry.setRefundType("order");
+                    return orderService.refund(orderBayInfoEntry);
+                }else{
+                    return Result.error(result.getMsg());
+                }
+            } else {
+                return Result.error("退款失败【"+sysBaseService.selectDictLabel("order_status", String.valueOf(dto.getStatus()))+"】!");
+            }
+        }else{
+            return Result.error("未查到订单信息!");
+        }
+    }
+
+    /**
+     *
+     */
+    private Result searchRefundGoods(Map params){
+        //签名
+        String timestamp = String.valueOf(System.currentTimeMillis()/1000);
+        String str1 = Md5Utils.hash(authPassword+timestamp).toUpperCase();
+        String str2 = BeanUtil.map2str(params);
+        String sign = Md5Utils.hash(str1 + str2).toUpperCase();
+        String url = MessageFormat.format(queryUrl, authUserName, sign, timestamp, JSONObject.toJSONString(params));
+        String ret = HttpClientUtil.httpsRequest(url, "GET", null, null);
+        log.info(" 查询结果:{} ",ret);
+        System.out.println(" 查询结果:"+ret);
+        JSONObject jsonObject = JSONObject.parseObject(ret);
+        if(null != jsonObject && 0 == jsonObject.getInteger("status_code")){
+            JSONObject data = jsonObject.getJSONObject("data");
+            if(null != data){
+                JSONObject pro_status = data.getJSONObject("pro_status");
+                Map<String,Integer> successNums = new HashMap<>();
+                pro_status.forEach((item,value)-> {
+                    successNums.put(item, Math.toIntExact(JSONArray.parseArray(JSONArray.toJSONString(value),String.class).stream().filter(s -> s.equals( "success")).count()));
+                });
+                return Result.success()
+                        .put("successNums",successNums)
+                        ;
+            }
+        }
+        return Result.error(jsonObject.getString("msg"));
+    }
+
+    public static void main(String[] args) {
+        VendingMachineOrderServiceImpl service = new VendingMachineOrderServiceImpl();
+        Map<String ,Object> params = new HashMap<>();
+        params.put("out_order_no","12345678913");
+        service.searchRefundGoods(params);
+    }
+
+
+}

+ 42 - 0
auction-order/src/main/java/com/poyee/base/controller/SysBaseController.java

@@ -0,0 +1,42 @@
+package com.poyee.base.controller;
+
+import com.poyee.base.dto.DataEntry;
+import com.poyee.base.dto.DictBaseDto;
+import com.poyee.base.dto.Result;
+import com.poyee.base.dto.SysBaseDto;
+import com.poyee.base.entity.SysBase;
+import com.poyee.base.service.SysBaseService;
+import com.poyee.common.enums.BusinessType;
+import com.poyee.framework.annotation.Log;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 基础接口
+ */
+@Slf4j
+@Api("基础接口")
+@RestController
+@RequestMapping("/v1/api/base")
+public class SysBaseController extends BaseController<SysBaseService, SysBase, SysBaseDto> {
+
+    /**
+     * 验证资格
+     * @return
+     */
+    @ApiOperation(value = "获取基础数据@(1.0,2.0)" ,notes = "获取基础数据")
+    @ApiImplicitParam(name="请求数据",dataTypeClass = DataEntry.class)
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "返回结果" )
+    })
+    @Log(title = "获取基础数据", businessType = BusinessType.SEARCH)
+    @PostMapping("/selectData")
+    @ResponseBody
+    public Result<DictBaseDto> selectDictData(@RequestBody @Validated DataEntry dataEntry){
+        log.info(" 请求参数 》》》 {}",dataEntry);
+        return baseService.selectDictData(dataEntry);
+    }
+
+}

+ 21 - 0
auction-order/src/main/java/com/poyee/base/dto/DataEntry.java

@@ -0,0 +1,21 @@
+package com.poyee.base.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 请求参数
+ */
+@Data
+public class DataEntry {
+
+    @ApiModelProperty(value = "标记:sport=运动类型,manufacturer=发行商,year=赛季,sets=系列")
+    @NotBlank(message = "请求参数不能为空!")
+    private String key;
+
+    @ApiModelProperty(value = "搜索值:标记为:sets时可传值进行模糊搜索")
+    private String param;
+
+}

+ 33 - 0
auction-order/src/main/java/com/poyee/base/dto/DictBaseDto.java

@@ -0,0 +1,33 @@
+package com.poyee.base.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 字典表数据
+ */
+@Data
+@TableName("sys_dict_data")
+public class DictBaseDto implements Serializable {
+
+    private final static long serializableUid = 1l;
+
+    @ApiModelProperty(value = "唯一码",readOnly = true)
+    @TableId(value = "dict_code", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "标记",readOnly = true)
+    @TableField("dict_value")
+    private String key;
+
+    @ApiModelProperty(value = "名称",readOnly = true)
+    @TableField("dict_label")
+    private String name;
+
+}

+ 221 - 0
auction-order/src/main/java/com/poyee/base/dto/OrderBaseInfoDto.java

@@ -0,0 +1,221 @@
+package com.poyee.base.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 订单基础表
+ */
+@Data
+@ToString
+public class OrderBaseInfoDto implements Serializable {
+
+    /** id */
+    private Long id;
+
+    /** 组团信息id */
+    private Long groupInfoId;
+
+    /** 商家id */
+    private Long merchantId;
+    /**商家名*/
+    private String merchantName;
+
+    /** 用户id */
+    private Long userId;
+
+    private String nickname;
+
+    /** 收货地址id */
+    private Long shippingAddressId;
+
+    /** 购买数量 */
+    private Long purchaseCount;
+
+    /** 订单编码 */
+    private String orderNo;
+
+    /** 应付款 */
+    private BigDecimal accountsPayable;
+
+    /** 实付款 */
+    private BigDecimal actualPayment;
+
+    /** 支付方式-交易类型 */
+    private String paymentType;
+
+    /** 支付流水号-微信支付订单号 */
+    private String paymentNum;
+
+    /** 支付时间 */
+    private Date paymentTime;
+
+    /** 优惠券 */
+    private Long coupon;
+
+    /** 折扣 */
+    private BigDecimal discount;
+
+    /** 订单状态 */
+    private Long status;
+
+    /** 预支付交易会话标识:支付时用 */
+    private String prepayId;
+
+    /** 支付通知id */
+    private String paymentEvid;
+
+    /** 交易状态 */
+    private String paymentStatus;
+
+    /** 交易状态描述 */
+    private String paymentStatusDesc;
+
+    /** 付款银行 */
+    private String paymentBankType;
+
+    /** 支付完成时间 */
+    private Date paymentSuccessTime;
+
+    /** 姓名 */
+    private String shippingAddressLinkname;
+
+    /** 收货地址 */
+    private String shippingAddress;
+
+    /** 联系方式 */
+    private String shippingAddressPhone;
+
+    /** 删除标记:0=正常,1=删除 */
+    private Long delFlg;
+
+    /** 快递单号 */
+    private String courierNum;
+
+    /** 快递公司 */
+    private String curierCompany;
+
+    /** 商户退款单号 */
+    private String outRefundNo;
+
+    /** 微信退款id */
+    private String refundId;
+
+    /** 退款金额 */
+    private BigDecimal refundFee;
+
+    /** 退款时间 */
+    private Date refundTime;
+
+    /** 是否匿名 */
+    private Boolean anonymous;
+
+    /** 提货方式 */
+    private String pickUpType;
+
+    /** 发货时间 */
+    private Date shipTime;
+
+    /** 退款成功时间 */
+    private Date refundSuccessTime;
+
+    /** 退款入账账户 */
+    private String refundRecvAccout;
+
+    /** 退款资金来源 */
+    private String refundAccount;
+
+    /** 退款发起来源 */
+    private String refundRequestSource;
+
+    /** 单价 */
+    private BigDecimal cardPrice;
+
+    /** 活动价 */
+    private BigDecimal actPrice;
+
+    /** 价格json */
+    private String goodsPriceJson;
+
+    /**  */
+    private String paymentSubType;
+
+    /** 买队优先订单 */
+    private String teamFirst;
+
+    /** 是否接受累积发货 */
+    private Long refuseStatus;
+
+    /** 备用 */
+    private String prop1;
+
+    /** 备用 */
+    private String prop2;
+
+    /** 备用 */
+    private String prop3;
+
+    /** 备用 */
+    private String prop4;
+
+    /** 支付编号 qm */
+    private String tradeNo;
+
+    /** 消耗积分 */
+    private Long point;
+
+    /** 订单交易金额 */
+    private BigDecimal tradeAmount;
+
+    /** 订单类型 */
+    private String orderType;
+
+    /** 仅退款refund_amount,退货退款refund_goods,换货change */
+    private String refundType;
+
+    /** 订单退换原因 */
+    private String refundReason;
+
+    /** 订单评价 */
+    private String evaluation;
+
+    /** 退换物流公司 */
+    private String refundCurierCompany;
+
+    /** 退换物流单号 */
+    private String refundCourierNum;
+
+    /** 退换申请时间 */
+    private Date userRefundTime;
+
+    /** 1:申请  2同意 3拒绝 ,4退回货物  5商家收到货 */
+    private Long refundStatus;
+
+    /** 退换物流时间 */
+    private Date refundShipTime;
+
+    /** 商家拒绝原因 */
+    private String merchantRefundReason;
+
+    private String remark;
+
+    private Date createTime;
+
+    private String createBy;
+
+    private Date updateTime;
+
+    private String updateBy;
+
+    private String goodsName;
+    /**
+     * close_payment_time
+     */
+    private Date closePaymentTime;
+
+
+}

+ 7 - 0
auction-order/src/main/java/com/poyee/base/dto/SysBaseDto.java

@@ -0,0 +1,7 @@
+package com.poyee.base.dto;
+
+import lombok.Data;
+
+@Data
+public class SysBaseDto {
+}

+ 277 - 0
auction-order/src/main/java/com/poyee/base/dto/SysFinanceDto.java

@@ -0,0 +1,277 @@
+package com.poyee.base.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ToString
+public class SysFinanceDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 操作类型
+     * 收入=0
+     * 退款=1
+     */
+    private String type;
+
+    /**
+     * 组团信息id
+     */
+    private Long groupInfoId;
+
+    /**
+     * 组团名称
+     */
+    private String groupInfoName;
+
+    /**
+     * 组团编码
+     */
+    private String groupInfoCode;
+
+    /**
+     * 商家id
+     */
+    private Long merchantId;
+
+    /**
+     * 商家名称
+     */
+    private String merchantName;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 用户手机号
+     */
+    private String userPhone;
+
+    /**
+     * 订单编码
+     */
+    private String orderNo;
+
+    /**
+     * 购买数量
+     */
+    private Long purchaseCount;
+
+    /**
+     * 应付款
+     */
+    private BigDecimal accountsPayable;
+
+    /**
+     * 实付款
+     */
+    private BigDecimal actualPayment;
+
+    /**
+     * 支付方式-交易类型
+     */
+    private String paymentType;
+
+    /**
+     * 支付流水号
+     */
+    private String paymentNum;
+
+    /**
+     * 支付时间
+     */
+    private Date paymentTime;
+
+    /**
+     * 优惠券id
+     */
+    private Long couponId;
+
+    /**
+     * 优惠券
+     */
+    private String coupon;
+
+    /**
+     * 折扣
+     */
+    private BigDecimal discount;
+
+    /**
+     * 预支付交易会话标识:支付时用
+     */
+    private String prepayId;
+
+    /**
+     * 支付通知id
+     */
+    private String paymentEvid;
+
+    /**
+     * 交易状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 交易状态描述
+     */
+    private String paymentStatusDesc;
+
+    /**
+     * 付款银行
+     */
+    private String paymentBankType;
+
+    /**
+     * 支付完成时间
+     */
+    private Date paymentSuccessTime;
+
+    /**
+     * 微信退款id
+     */
+    private String refundId;
+
+    /**
+     * 商户退款单号
+     */
+    private String outRefundNo;
+
+    /**
+     * 退款金额
+     */
+    private BigDecimal refundFee;
+
+    /**
+     * 退款时间
+     */
+    private Date refundTime;
+
+    /**
+     * 是否匿名
+     */
+    private Long anonymous;
+
+    /**
+     * 提货方式
+     */
+    private String pickUpType;
+
+    /**
+     * 收货地址id
+     */
+    private Long shippingAddressId;
+
+    /**
+     * 收货姓名
+     */
+    private String shippingAddressLinkname;
+
+    /**
+     * 收货地址
+     */
+    private String shippingAddress;
+
+    /**
+     * 收货联系方式
+     */
+    private String shippingAddressPhone;
+
+    /**
+     * 快递单号
+     */
+    private String courierNum;
+
+    /**
+     * 快递公司
+     */
+    private String curierCompany;
+
+    /**
+     * 发货时间
+     */
+    private Date shipTime;
+
+    /**
+     * 发票组织类型:个人/企业
+     */
+    private String invoiceOrgType;
+
+    /**
+     * 发票抬头
+     */
+    private String invoiceTitle;
+
+    /**
+     * 发票税号
+     */
+    private String invoiceTaxNo;
+
+    /**
+     * 删除标记:0=正常,1=删除
+     */
+    private Long delFlg;
+    /**
+     * trade_no
+     */
+    private String tradeNo;
+    /**
+     * close_payment_time
+     */
+    private Date closePaymentTime;
+    /**
+     * payment_sub_type
+     */
+    private String paymentSubType;
+
+    /**
+     * 订单状态
+     */
+    private String status;
+
+    private Date beginShipTime;
+
+    private Date endShipTime;
+
+    private Date beginRefundTime;
+
+    private Date endRefundTime;
+
+    private Date beginPaymentSuccessTime;
+
+    private Date endPaymentSuccessTime;
+
+    private Date beginPaymentTime;
+
+    private Date endPaymentTime;
+
+    private String remark;
+
+    private Date createTime;
+
+    private String createBy;
+
+    private Date updateTime;
+
+    private String updateBy;
+
+
+}

+ 120 - 0
auction-order/src/main/java/com/poyee/base/dto/UserBankInfoDto.java

@@ -0,0 +1,120 @@
+package com.poyee.base.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.common.enums.DesensitType;
+import com.poyee.framework.annotation.Desensit;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author lsz
+ * @since 2023-05-26
+ */
+@Getter
+@Setter
+@TableName("user_bank_info")
+@ApiModel(value = "UserBankInfo对象", description = "")
+public class UserBankInfoDto extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty("银行卡类型")
+    @TableField("bank_type")
+    private String bankType;
+
+    @ApiModelProperty("银行卡名称")
+    @TableField("bank_name")
+    private String bankName;
+
+    @ApiModelProperty("协议号")
+    @TableField("msg_id")
+    @Desensit(type = DesensitType.NULL)
+    private String msgId;
+
+    @ApiModelProperty("绑定时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("状态:0正常,1解绑")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("解绑时间")
+    @TableField("unbanding_time")
+    private LocalDateTime unbandingTime;
+
+    @ApiModelProperty("配置参数")
+    @TableField("config_data")
+    @Desensit(type = DesensitType.NULL)
+    private String configData;
+
+    @ApiModelProperty("平台:[recharge]=钱包,[宝付快捷支付]")
+    @TableField("type")
+    private String type;
+
+    @ApiModelProperty("银行卡号")
+    @TableField("bank_no")
+    @Desensit
+    private String bankNo;
+
+    @ApiModelProperty("支付平台编码")
+    @TableField("type_code")
+    private String typeCode;
+
+    @ApiModelProperty("支付平台开户账号")
+    @TableField("account")
+    @Desensit(type = DesensitType.NULL)
+    private String account;
+    //账户状态:0=待确认,100=待上传资料,101=资料上传失败。200=待激活,201=激活失败,300=开户成功 ,400=解绑成功
+    @ApiModelProperty("账户状态")
+    @TableField("account_status")
+    private int accountStatus;
+
+    public String getAccountStatusMsg(){
+        String msg = "未明确状态";
+        switch (this.accountStatus){
+            case 0:
+                msg = "待确认";
+                break;
+            case 100:
+                msg = "待上传资料";
+                break;
+            case 101:
+                msg = "资料上传失败";
+                break;
+            case 200:
+                msg = "待激活";
+                break;
+            case 201:
+                msg = "激活失败";
+                break;
+            case 300:
+                msg = "开户成功";
+                break;
+            case 400:
+                msg = "解绑成功";
+                break;
+        }
+        return msg;
+    }
+
+}

+ 186 - 0
auction-order/src/main/java/com/poyee/base/entity/MerchantInfo.java

@@ -0,0 +1,186 @@
+package com.poyee.base.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Getter
+@Setter
+public class MerchantInfo extends BaseEntity implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    @TableField("name")
+    @ApiModelProperty("账号类型:person=个人,merchant=商家")
+    private String name;
+    @TableField("code")
+    @ApiModelProperty("账号类型:person=个人,merchant=商家")
+    private String code;
+    @TableField("username")
+    private String username;
+    /** 商家id */
+    @TableField("username")
+    private Long merchantId;
+    /** 商家名称 */
+    @TableField("merchantName")
+    private String merchantName;
+
+    /** 注册类型: 00:企业商户 01:个人工商户 02:小微商户 03:机关事业单位或社会团体 05:民办非企业; */
+    private String regMerType;
+
+    /** 法人身份证姓名 法人身份证姓名 */
+    private String legalName;
+
+    /** 法人身份证号;//法人身份证号 */
+    private Long legalIdcardNo;
+
+    /** 法人手机号;法人手机号 */
+    private String legalMobile;
+
+    /** 法人邮箱;法人邮箱 */
+    private String legalEmail;
+
+    /** 法人代表证件截止日期;(10);//yyyy-MM-dd; */
+    private String legalCardDeadline;
+
+    /** 法人性别;//n1;//企业类型为小微商户时必填,参数按国际标准传;//C */
+    private Long legalSex;
+
+    /** 法人职业;//n2;//企业类型为小微商户时必填;0-各类专业、技术人员1-国家机关、党群组织、企事业单位的负责人2-办事人员和有关人员3-商业工作人员4-服务性工作人员5-农林牧渔劳动者6-生产工作、运输工作和部分体力劳动者7-不便分类的其他劳动者 */
+    private Long legalOccupation;
+
+    /** 法人职业详细描述;(40);//legal_occupation为7-不便分类的其他劳动者时必填; */
+    private String legalmanCareerDesc;
+
+    /** 商户营业名称; */
+    private String shopName;
+
+    /** 开户行行号; */
+    private String bankNo;
+
+    /** 账户类型;0:个人账户  1:公司账户 */
+    private String bankAcctType;
+
+    /** 开户行帐号; */
+    private String bankAcctNo;
+
+    /** 开户帐号名称; */
+    private String bankAcctName;
+
+    private String bankAcctAddr;
+
+    /** 营业省份id */
+    private String shopProvinceId;
+
+    /** 营业市id; */
+    private String shopCityId;
+
+    /** 营业区id */
+    private String shopCountryId;
+
+    /** 营业地址补充信息 */
+    private String shopAddrExt;
+
+    /** 社会信用统一代码/营业执照号 */
+    private String shopLic;
+
+    /** 开通业务 */
+    private String product;
+
+    /** 是否有营业场所:,0代表没有,1代表有 */
+    private Long havingFixedBusiAddr;
+
+    /** 控股股东姓名 */
+    private String shareholderName;
+
+    /** 控股股东证件号; */
+    private String shareholderCertno;
+
+    /** 控股股东证件有效期 yyyy-MM-dd */
+    private String shareholderCertExpire;
+
+    /** 控股股东证件证件类型:不填默认为身份证(1):1、身份证2、护照3、军官证4、警官证5、士兵证6、台湾居民来往大陆通行证7、回乡证8、港澳居民来往内地通行证10、港澳台居民居住证11、营业执照12、组织机构代码证13、税务登记证14、商业登记证15、民办非企业登记证书16、批文证明 */
+    private String shareholderCertType;
+
+    /** 控股股东家庭地址 */
+    private String shareholderHomeAddr;
+
+    /** 商户传真 */
+    private String fax;
+
+    /** 终端维护经理 */
+    private String lastTerminalManager;
+
+    /** 客户维护经理 */
+    private String lastClientManager;
+
+    /** 所属服务区域 */
+    private String serviceDistrict;
+
+    /** 细分服务区域 */
+    private String detailDistrict;
+
+    /** 发展部门 */
+    private String developingDept;
+
+    /** 发展人或账号 */
+    private String developingPersonId;
+
+    /** 受益人列表 */
+    private String bnfList;
+
+    /** 法人家庭地址 */
+    private String legalmanHomeAddr;
+
+    /** 上传图片列表 */
+    private String picList;
+
+    /** 二维码id列表 */
+    private String umsQrcodeList;
+
+    /** 状态:0 */
+    private Long status;
+
+    private String reviewMsg;
+
+    /** 删除:0 */
+    private Long delFlag;
+    //成立时间   shop_register_time
+    private Date shopRegisterTime;
+    //店铺简介  shop_profile
+    private String shopProfile;
+    /**
+     * 公司注册地址
+     * company_addr
+     *  */
+    private String companyAddr;
+    //注册资本 register_capital
+    private String registerCapital;
+    private String avatar;
+    //营业执照过期时间 lic_start_time
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date LicStartTime;
+    //营业执照过期时间 expire_time
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date LicExpireTime;
+
+    private Boolean defult;
+    /**
+     * bank_review_status
+     * 开户行信息审核状态:0 待提交,1 待审核,2审核拒绝,3审核通过
+     */
+    private Integer bankReviewStatus;
+
+    private String phone;
+
+}

+ 7 - 0
auction-order/src/main/java/com/poyee/base/entity/SysBase.java

@@ -0,0 +1,7 @@
+package com.poyee.base.entity;
+
+import lombok.Data;
+
+@Data
+public class SysBase extends BaseEntity {
+}

+ 124 - 0
auction-order/src/main/java/com/poyee/base/entity/UserBankInfo.java

@@ -0,0 +1,124 @@
+package com.poyee.base.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lsz
+ * @since 2023-05-26
+ */
+@Getter
+@Setter
+  @TableName("user_bank_info")
+@ApiModel(value = "UserBankInfo对象", description = "")
+public class UserBankInfo extends BaseEntity  {
+
+    private static final long serialVersionUID = 1L;
+
+      @TableId(value = "id", type = IdType.AUTO)
+      private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField(exist = false)
+    private String payWay;
+
+      @ApiModelProperty("银行卡类型")
+      @TableField("bank_type")
+    private String bankType;
+
+      @ApiModelProperty("银行卡名称")
+      @TableField("bank_name")
+    private String bankName;
+
+      @ApiModelProperty(value = "协议号" ,hidden = true)
+      @TableField("msg_id")
+    private String msgId;
+
+      @ApiModelProperty("绑定时间")
+      @TableField(value = "create_time" ,fill = FieldFill.INSERT)
+    private Date createTime;
+
+      @ApiModelProperty("状态:0待确认,1已绑定,2已解绑")
+      @TableField("status")
+    private Integer status;
+
+      @ApiModelProperty("解绑时间")
+      @TableField("unbanding_time")
+    private Date unbandingTime;
+
+      @ApiModelProperty(value = "配置参数",hidden = true)
+      @TableField("config_data")
+    private String configData;
+
+      @ApiModelProperty("平台")
+      @TableField("type")
+    private String type;
+
+      @ApiModelProperty("银行卡号")
+      @TableField("bank_no")
+    private String bankNo;
+
+      @ApiModelProperty("支付平台编码")
+      @TableField("type_code")
+    private String typeCode;
+
+      @ApiModelProperty("支付平台开户账号")
+      @TableField("account")
+    private String account;
+
+    @ApiModelProperty("账号类型:person=个人,merchant=商家")
+    @TableField("account_type")
+    private String accountType;
+
+    @ApiModelProperty("商家主体id")
+    @TableField("merchant_archives_id")
+    private Integer merchantArchivesId;
+
+    @ApiModelProperty("商家id")
+    @TableField("merchant_id")
+    private Integer merchantId;
+    //账户状态:0=待确认,100=待上传资料,101=资料上传失败。200=待激活,201=激活失败,300=开户成功,400=解绑成功
+    @ApiModelProperty("账户状态")
+    @TableField("account_status")
+    private Integer accountStatus;
+
+    public String getAccountStatusMsg(){
+        String msg = "未明确状态";
+        switch (this.accountStatus){
+            case 0:
+                msg = "待确认";
+                break;
+            case 100:
+                msg = "待上传资料";
+                break;
+            case 101:
+                msg = "资料上传失败";
+                break;
+            case 200:
+                msg = "待激活";
+                break;
+            case 201:
+                msg = "激活失败";
+                break;
+            case 300:
+                msg = "开户成功";
+                break;
+            case 400:
+                msg = "解绑成功";
+                break;
+        }
+        return msg;
+    }
+
+}

+ 88 - 0
auction-order/src/main/java/com/poyee/base/mapper/SysBaseMapper.java

@@ -0,0 +1,88 @@
+package com.poyee.base.mapper;
+
+import com.poyee.base.dto.DictBaseDto;
+import com.poyee.base.dto.SysFinanceDto;
+import com.poyee.base.entity.SysBase;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface SysBaseMapper extends IBaseMapper<SysBase> {
+
+    @Select(" select " +
+            "     dict_code as id, " +
+            "     dict_value as key, " +
+            "     dict_label as name " +
+            " from " +
+            "     sys_dict_data " +
+            " where " +
+            "   status = '1' " +
+            "   and dict_type = #{key} " +
+            " order by dict_sort"
+            )
+    public List<DictBaseDto> selectDictData(@Param("key")String key);
+
+
+    @Select(" select " +
+            "     dict_label  " +
+            " from " +
+            "     sys_dict_data " +
+            " where " +
+            "   status = '1' " +
+            "   and dict_type = #{item} " +
+            "   and dict_value = #{key} " +
+            " order by dict_sort"
+    )
+    public String selectDictLabel(@Param("item")String item,@Param("key")String key);
+
+    @Select(" select " +
+            "     dict_value  " +
+            " from " +
+            "     sys_dict_data " +
+            " where " +
+            "   status = '1' " +
+            "   and dict_type = #{item} " +
+            "   and dict_label = #{label} " +
+            " order by dict_sort"
+    )
+    public String selectDictValue(@Param("item")String item,@Param("label")String label);
+
+
+    @Select(" select " +
+            "     id as id, " +
+            "     sets as key, " +
+            "     display_name as name " +
+            " from " +
+            "     panini_checklist_base_info " +
+            " where " +
+            "   status = '1' " +
+            "   and (display_name ilike CONCAT('%',#{key},'%') ) or sets ilike CONCAT('%',#{key},'%') ) ) " +
+            " order by display_name"
+    )
+    public List<DictBaseDto> selectCheckListSets(@Param("sets")String sets);
+
+    /**
+     * 根据订单编码查询
+     * @param orderNo
+     * @return
+     */
+    public List<SysFinanceDto> getFinanceByOrderNo(@Param("orderNo") String orderNo, @Param("type")String type);
+    /**
+     * 更新财务对账信息
+     * @return
+     */
+    public int updateSysFinance(SysFinanceDto sysFinanceDto);
+
+    /**
+     * 新增财务对账信息
+     * @param sysFinanceDto
+     * @return
+     */
+    public int insertSysFinance(SysFinanceDto sysFinanceDto);
+
+
+
+}

+ 25 - 0
auction-order/src/main/java/com/poyee/base/mapper/UserBankInfoMapper.java

@@ -0,0 +1,25 @@
+package com.poyee.base.mapper;
+
+import com.poyee.base.entity.MerchantInfo;
+import com.poyee.base.entity.UserBankInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author lsz
+ * @since 2023-05-26
+ */
+@Mapper
+public interface UserBankInfoMapper extends IBaseMapper<UserBankInfo> {
+
+    @Select("select a.id ,a.code ,a.name " +
+            "from tzy_merchant_info a " +
+            "left join tzy_merchant_archives b on b.merchant_id = a.id " +
+            "where b.id = ${archiveId} " )
+    public MerchantInfo getMerchantInfoById(Integer archiveId);
+
+}

+ 17 - 0
auction-order/src/main/java/com/poyee/base/service/IUserBankInfoService.java

@@ -0,0 +1,17 @@
+package com.poyee.base.service;
+
+
+import com.poyee.base.dto.UserBankInfoDto;
+import com.poyee.base.entity.UserBankInfo;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author lsz
+ * @since 2023-05-26
+ */
+public interface IUserBankInfoService extends BaseService<UserBankInfo, UserBankInfoDto> {
+
+}

+ 16 - 0
auction-order/src/main/java/com/poyee/base/service/SysBaseService.java

@@ -0,0 +1,16 @@
+package com.poyee.base.service;
+
+import com.poyee.base.dto.*;
+import com.poyee.base.entity.SysBase;
+
+public interface SysBaseService extends BaseService<SysBase, SysBaseDto>{
+
+    public void insertSysFinceByOrder(OrderBaseInfoDto orderInfo, String type);
+
+    public Result<DictBaseDto> selectDictData(DataEntry dataEntry);
+
+    public String selectDictLabel(String item, String key);
+
+    public String selectDictValue(String item, String key);
+
+}

+ 86 - 0
auction-order/src/main/java/com/poyee/base/service/impl/SysBaseServiceImpl.java

@@ -0,0 +1,86 @@
+package com.poyee.base.service.impl;
+
+import com.poyee.base.dto.*;
+import com.poyee.base.entity.SysBase;
+import com.poyee.base.mapper.SysBaseMapper;
+import com.poyee.base.service.SysBaseService;
+import com.poyee.util.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import static com.poyee.util.AuctionConstant.auctionDictTypes;
+
+/**
+ *
+ */
+@Slf4j
+@Service
+public class SysBaseServiceImpl extends BaseServiceImpl<SysBaseMapper, SysBase, SysBaseDto> implements SysBaseService {
+
+    /**
+     *
+     * @param orderInfo
+     * @param type
+     */
+    public void insertSysFinceByOrder(OrderBaseInfoDto orderInfo, String type) {
+        if(orderInfo==null || StringUtils.isEmpty(type)){
+            return;
+        }
+        synchronized(this){
+            List<SysFinanceDto> sysFinanceDtos = baseMapper.getFinanceByOrderNo(orderInfo.getOrderNo(),type);
+            boolean isNew=false;
+            SysFinanceDto sysFinance = new SysFinanceDto();
+            if(null != sysFinanceDtos && sysFinanceDtos.size() > 0){
+                sysFinance = sysFinanceDtos.get(0);
+            }else{
+                isNew=true;
+            }
+            BeanUtils.copyProperties(orderInfo, sysFinance);
+            //查询用户信息
+            AppBaseUser appUserInfo = getAppUserInfo(Math.toIntExact(sysFinance.getUserId()));
+            if(null != appUserInfo){
+                sysFinance.setUserName(appUserInfo.getNickname());
+                sysFinance.setUserPhone(appUserInfo.getPhone());
+            }
+            sysFinance.setType(type);
+            if(isNew){
+                sysFinance.setCreateTime(DateUtils.getNowDate());
+                baseMapper.insertSysFinance(sysFinance);
+            }else{
+                sysFinance.setUpdateTime(DateUtils.getNowDate());
+                baseMapper.updateSysFinance(sysFinance);
+            }
+            log.info("新增:{},财务对账记录,订单编码【{}】,类型:{}",isNew,orderInfo.getOrderNo(),type);
+        }
+    }
+
+    @Override
+    public Result<DictBaseDto> selectDictData(DataEntry dataEntry){
+        Result result = Result.ok();
+        String key = dataEntry.getKey();
+        if(auctionDictTypes.contains(key)){//字典表数据
+            List<DictBaseDto> dictBaseDtos = baseMapper.selectDictData(key);
+            result = result.addList(dictBaseDtos);
+        } else { //系列等 查询checklist
+            List<DictBaseDto> dictBaseDtos = baseMapper.selectCheckListSets(dataEntry.getParam());
+            result = result.addList(dictBaseDtos);
+        }
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+    @Override
+    public String selectDictLabel(String item, String key){
+        return baseMapper.selectDictLabel(item, key);
+    }
+
+    @Override
+    public String selectDictValue(String item, String key){
+        return baseMapper.selectDictValue(item, key);
+    }
+
+}

+ 20 - 0
auction-order/src/main/java/com/poyee/base/service/impl/UserBankInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.poyee.base.service.impl;
+
+import com.poyee.base.dto.UserBankInfoDto;
+import com.poyee.base.entity.UserBankInfo;
+import com.poyee.base.mapper.UserBankInfoMapper;
+import com.poyee.base.service.IUserBankInfoService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author lsz
+ * @since 2023-05-26
+ */
+@Service
+public class UserBankInfoServiceImpl extends BaseServiceImpl<UserBankInfoMapper, UserBankInfo, UserBankInfoDto> implements IUserBankInfoService {
+
+}

+ 59 - 0
auction-order/src/main/java/com/poyee/util/AuctionConstant.java

@@ -0,0 +1,59 @@
+package com.poyee.util;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 拍卖常量
+ */
+public class AuctionConstant {
+    //拍卖账户保证金
+    public final static String AUCTION_ACCOUNT_BOND = "auction_account_bond_";
+
+    public final static String ACCOUNT_POINT = "account_point";
+    public final static String ACCOUNT_AMOUNT = "account_amount";
+
+    //保证金订单
+    public final static String ORDER_TYPE_BOND = "BOND";
+    //竞拍订单
+    public final static String ORDER_TYPE_AUCTION = "AUCTION";
+    //议价订单
+    public final static String ORDER_TYPE_BARGAIN = "BARGAIN";
+
+    //单品
+    public final static String AUCTION_TYPE_SINGLE = "SINGLE";
+    //拍卖会
+    public final static String AUCTION_TYPE_MEETING = "MEETING";
+
+    //Account:账户保证金
+    public static String MODE_ACCOUNT = "ACCOUNT";
+    //Lot:单品保证金
+    public static String MODE_LOT = "LOT";
+    //Auction:专场保证金
+    public static String MODE_AUCTION = "AUCTION";
+    public static List<String> modes = Arrays.asList(MODE_ACCOUNT,MODE_LOT,MODE_AUCTION);
+    //POINT:积分
+    public static String CATEGORY_POINT = "POINT";
+    //AMOUNT:金额
+    public static String CATEGORY_AMOUNT = "AMOUNT";
+    //PAMOUNT:积分+金额
+    public static String CATEGORY_PAMOUNT = "PAMOUNT";
+    //POINTORAMOUNT:积分或金额
+    public static String CATEGORY_POINTORAMOUNT = "POINTORAMOUNT";
+    public static List<String> categorys = Arrays.asList(CATEGORY_POINT,CATEGORY_AMOUNT,CATEGORY_PAMOUNT,CATEGORY_POINTORAMOUNT);
+
+    //运动类型
+    public static String TYPE_SPORT = "sport";
+    //发行商
+    public static String TYPE_MANUFACTURER = "manufacturer";
+    //赛季
+    public static String TYPE_YEAR = "year";
+    //系列
+    public static String TYPE_SETS = "sets";
+    //系列版本
+    public static String TYPE_SETS_VERSION = "sets_version";
+    public static List<String> auctionDictTypes = Arrays.asList(TYPE_SPORT,TYPE_MANUFACTURER,TYPE_YEAR);
+
+
+
+}

+ 51 - 0
auction-order/src/main/java/com/tzy/sportcard/point/domain/AppUserPointRecord.java

@@ -0,0 +1,51 @@
+package com.tzy.sportcard.point.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 对象 app_user_point_record
+ * 
+ * @author tencheer
+ * @date 2022-02-08
+ */
+@Data
+public class AppUserPointRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 当前积分 */
+    private Long currPoint;
+
+    /** 上次积分 */
+    private Long lastPoint;
+
+    /** 增加积分 */
+    private Integer changePoint;
+
+    /** 订单id */
+    private Long orderId;
+
+    private String orderNo;
+
+    private Long merchantId;
+    /**商户积分:merchant , 平台积分 common*/
+    private String type;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 是否扣除用户表积分,1代表已扣除过,0代表未扣除,不记录表中
+     */
+    private Integer userDeduct;
+}

+ 60 - 0
auction-order/src/main/resources/application-dev.yml

@@ -0,0 +1,60 @@
+# 项目相关配置
+poyee:
+  # 缓存地址
+  profile: /tmp
+  #版本
+  app-version: dev
+  host: localhost:8081
+
+# Spring配置
+spring:
+  devtools:
+    restart:
+      enabled: false
+  redis:
+    database: 3
+    password: ${REDIS_PASSWORD:Pass2010}
+    sentinel:
+      master: ${SENTINEL_MASTER:poyee-master}
+      nodes: ${SENTINEL_NODES:127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381}
+    lettuce.pool:
+      max-active: 10
+      min-idle: 2
+      max-idle: 5
+      max-wait: -1
+      # 关闭连接之前等待任务处理完成的最长时间
+      shutdown-timeout: 100
+  profiles:
+    active: dev
+#物流
+express:
+  baoli:
+    appid: 8EAVI2
+    appSecret: 8b36128d20f85a08b916b03857e367bc
+    host: https://pay.ulifego.com/test #http://47.106.165.2:8088/ht #
+#支付下单地址
+#pay:
+#  unified: http://localhost:8082/p1/unified
+#  query: http://localhost:8082/p1/query
+#  refund: http://localhost:8082/p1/refund
+#  refundQuery: http://localhost:8082/p1/refundQuery
+#  close: http://localhost:8082/p1/close
+#  walletInfo: http://localhost:8082/p1/sycnWalletInfo
+pay:
+  payCat: https://bid-dev.auction.hobbystocks.cn/pay/p1/api/remotePayChannel/list
+  payCategory: https://bid-dev.auction.hobbystocks.cn/pay/p1/api/remotePayChannel/getPayCategory
+  unified: https://bid-dev.auction.hobbystocks.cn/pay/p1/unified
+  unifiedV2: https://bid-dev.auction.hobbystocks.cn/pay/p1/v2/unified
+  query: https://bid-dev.auction.hobbystocks.cn/pay/p1/query
+  refund: https://bid-dev.auction.hobbystocks.cn/pay/p1/refund
+  refundQuery: https://bid-dev.auction.hobbystocks.cn/pay/p1/refundQuery
+  close: https://bid-dev.auction.hobbystocks.cn/pay/p1/close
+  walletInfo: https://bid-dev.auction.hobbystocks.cn/pay/p1/sycnWalletInfo
+user:
+  #获取用户详情
+  info-url: https://coresvc-dev.hobbystocks.cn/user/
+
+
+recharge:
+  sycnWalletInfo: https://bid-dev.auction.hobbystocks.cn/pay/p1/sycnWalletInfo
+

+ 68 - 0
auction-order/src/main/resources/application-prod.yml

@@ -0,0 +1,68 @@
+# 项目相关配置
+poyee:
+  # 缓存地址
+  profile: /tmp
+  #版本
+  app-version: prod
+  host: localhost:8081
+
+# Spring配置
+spring:
+  application.name: poyee-auction-order
+  devtools:
+    restart:
+      enabled: false
+  redis:
+    database: ${REDIS_DATABASE:3}
+    password: ${REDIS_PASSWORD:Pass2010}
+    sentinel:
+      master: ${SENTINEL_MASTER:poyee-master}
+      nodes: ${SENTINEL_NODES:127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381}
+    lettuce.pool:
+      max-active: 30
+      min-idle: 5
+      max-idle: 10
+      max-wait: -1
+      # 关闭连接之前等待任务处理完成的最长时间
+      shutdown-timeout: 100
+  #数据源配置
+  datasource:
+    url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/tzy_system}
+    username: ${SPRING_DATASOURCE_USERNAME:postgres}
+    password: ${SPRING_DATASOURCE_PASSWORD:123456}
+    type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: org.postgresql.Driver
+    druid:
+      webStatFilter:
+        enabled: false
+#物流
+express:
+  baoli:
+    appid: 8EAVI2
+    appSecret: 8b36128d20f85a08b916b03857e367bc
+    host: http://47.106.165.2:8088/ht
+
+#支付下单地址
+pay:
+  payCat: http://poyee-other-pay/p1/api/remotePayChannel/list
+  payCategory: http://poyee-other-pay/p1/api/remotePayChannel/getPayCategory
+  unified: http://poyee-other-pay/p1/unified
+  unifiedV2: http://poyee-other-pay/p1/v2/unified
+  query: http://poyee-other-pay/p1/query
+  refund: http://poyee-other-pay/p1/refund
+  refundQuery: http://poyee-other-pay/p1/refundQuery
+  close: http://poyee-other-pay/p1/close
+  walletInfo: http://poyee-other-pay/p1/sycnWalletInfo
+
+recharge:
+  sycnWalletInfo: http://poyee-other-pay/p1/sycnWalletInfo
+
+user:
+  #获取用户详情
+  info-url: http://coresvc2/user/
+
+auc:
+  internal_lot: http://auction-auc/internal/lot/paid #拍品支付回传
+  getNoFinished: http://txmall-bid-DEV/internal/lot/getNoFinished #查询用户账户保证金
+
+

+ 168 - 0
auction-order/src/main/resources/application.yml

@@ -0,0 +1,168 @@
+# 项目相关配置
+poyee:
+  # 名称
+  name: poyee-auction-order
+  profile: c:/tmp
+  # 版本
+  version: 1.0.0
+  # 版权年份
+  copyrightYear: 2022
+  # 实例演示开关
+  demoEnabled: true
+  # 获取ip地址开关
+  addressEnabled: true
+  #版本
+  app-version: prod
+
+management:
+  endpoint:
+    health.show-details: always
+
+# Spring配置
+spring:
+  application.name: poyee-auction-order
+  profiles:
+    active: prod
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size:  50MB
+      # 设置总上传的文件大小
+      max-request-size:  50MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+      #数据源配置
+  datasource:
+    url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/tzy_system}
+    username: ${SPRING_DATASOURCE_USERNAME:postgres}
+    password: ${SPRING_DATASOURCE_PASSWORD:123456}
+    type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: org.postgresql.Driver
+    druid:
+      webStatFilter:
+        enabled: false
+  redis:
+    database: 1
+    host: 127.0.0.1
+    #host: hobbystock.cn
+    port: 6379
+    password: #Pass2021    # 密码(默认为空)
+    timeout: 60000  # 连接超时时长(毫秒)
+    pool:
+      max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+      max-wait: -1ms    # 连接池最大阻塞等待时间(使用负值表示没有限制)
+      max-idle: 10      # 连接池中的最大空闲连接
+      min-idle: 5       # 连接池中的最小空闲连接
+  rabbitmq:
+    host: ${SPRING_RABBITMQ_HOST:m2-dev.hobbystocks.cn}
+    port: ${SPRING_RABBITMQ_PORT:5672}
+    username: ${SPRING_RABBITMQ_USERNAME:admin}
+    password: ${SPRING_RABBITMQ_PASSWORD:admin}
+    #确认消息已发送到交换机(Exchange)
+    publisher-confirms: true
+    #确认消息已发送到队列(Queue)
+    publisher-returns: true
+    template:
+      retry:
+        enabled: true
+      mandatory: true
+    listener:
+      simple:
+        acknowledge-mode: manual
+        #并发消费者初始化值
+        #concurrency: 10
+        #并发消费者的最大值
+        #max-concurrency: 20
+        #每个消费者每次监听时可拉取处理的消息数量
+        prefetch: 5
+      direct:
+        retry:
+          enabled: true
+          max-attempts: 1
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为80
+  port: 8081
+  servlet:
+    # 应用的访问路径
+    context-path: /
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # tomcat最大线程数,默认为200
+    max-threads: 200
+    # Tomcat启动初始化的线程数,默认值25
+    min-spare-threads: 25
+
+# 日志配置
+logging:
+  level:
+    com.poyee.framework: info
+    org.springframework: info
+  console.enabled: ${CONSOLE_ENABLED:true}
+  fluentd:
+    enabled: ${FLUENTD_ENABLED:true}
+    host: ${FLUENTD_HOST:fluentd-aggr}
+    port: ${FLUENTD_PORT:24224}
+
+
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: postgresql
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql
+
+#mybaties-plus sql日志打印
+#mybatis-plus:
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: true
+springfox:
+  documentation:
+    swagger:
+      v2:
+        path: /v2/api-docs-poyee
+#物流
+express:
+  sf:
+    client_code: LSSWCkEipb #顾客编码
+    check_word: 98vtuFMv6FQabirYZ3LD0OhI1fspjc4Z #校验码
+    box_url: https://sfapi-sbox.sf-express.com/std/service #沙箱环境的地址
+    url: https://sfapi-sbox.sf-express.com/std/service #https://sfapi.sf-express.com/std/service #生产环境的地址
+    blx_url: https://api-blx-test.benlai.com #https://api-blx.benlai.com
+    blx_username: 13817769588
+    blx_pwd: CHaoDinRaoNeng568743
+    blx_authorization: Basic d2ViOmQ4YmZjMzQwMWE3NTg5ZTc4NGIwNmJkZmdhMmFkMWM0ZQ== #Basic d2ViOmQ4YmZjMzQwMWE3NTg5ZTc4NGIwNmJkZmdhMmFkMWM0ZQ==
+    blx_public_key: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiIyIiwid3hVc2VySWQiOm51bGwsImdyb3VwQ3VzdG9tZXJDb2RlIjpudWxsLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3VzZXJkYXRhIjoic2h1bmRpYW50b25nIiwidXNlcl9uYW1lIjoic2h1bmRpYW50b25nIiwidXNlck5vIjoic2h1bmRpYW50b25nIiwiaXNzIjoiaHR0cDovL3JldGFpbGFwaS5iZW5sYWkuY29tIiwidmVyc2lvbiI6IjMiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwiY2xpZW50X2lkIjoid2ViIiwicGxhdGZvcm0iOiIyMDAiLCJwcmltYXJ5c2lkIjoxMDkwMDAxMDksImF1ZCI6WyJCZW5sYWkuTzJPRVJQLldlYkFwaSJdLCJpc3NfdGltZSI6MTY2OTM2NTIzOTY4Miwic2NvcGUiOlsiYWxsIl0sIm5pY2tuYW1lIjoi6aG655S16YCaIiwibmFtZSI6IumhuueUtemAmiIsImVycm9yX2NvZGUiOjAsInVzZXJUeXBlIjoyLCJleHAiOjE2Njk0NTE2MzksImp0aSI6Ijk3ZGVhMGU1LTM1MTItNGYxNi1hZDNmLWIwOTM1NjkyYjlhOCIsInVzZXJuYW1lIjoi6aG655S16YCaIn0.LDiAqV26qdBVWmfCHVvL2vHlfpOTbJG49Dck3qyjtoNRmB18oh1Y9an6HrTg9fSgEEskeY35aRmHZ7CsXqHw1y3Vu-U1Zs3gjapEEF-h9nloFI98IWEL0yalQHIzuIsdyHqSWrtstc7YEInwNzCiKtAJU7T6VUoxzI6pTGRRmY8
+    waybills_client_code: LSSFmyNTMl
+    waybills_check_word: Ifgu411qgqgfW0muLMKsJOCfN7IkkwIX #QNBP4ya1bW9OYk6QVee8kQ1K0xWklOFm  jd:
+    appkey: 76f41d301d75499f9a85f9603f535a26
+    appsecret: 44d5f413cebb406b867b4f5b3477b0af
+    redirect_uri: https://m-dev.hobbystocks.cn/api/home/jdAuth
+  resultUrl: https://m2-dev.hobbystocks.cn/expressInfo/result #运单轨迹
+  flushTokenUrl: https://m2-dev.hobbystocks.cn/expressInfo/flushToken #刷新运单token
+  threadNo: 3 #运单轨迹线程个数
+
+
+#支付下单地址
+#pay:
+#  unified: https://bid-dev.auction.hobbystocks.cn/pay/p1/unified
+#  query: https://bid-dev.auction.hobbystocks.cn/pay/p1/query
+#  refund: https://bid-dev.auction.hobbystocks.cn/pay/p1/refund
+#  refundQuery: https://bid-dev.auction.hobbystocks.cn/pay/p1/refundQuery
+#  close: https://bid-dev.auction.hobbystocks.cn/pay/p1/close
+
+

+ 21 - 0
auction-order/src/main/resources/logback-fluentd.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<included>
+    <appender name="FLUENT_SYNC" class="ch.qos.logback.more.appenders.DataFluentAppender">
+        <tag>logback</tag>
+        <label>${spring.application.name}.${hostname}</label>
+        <remoteHost>${logging.fluentd.host}</remoteHost>
+        <port>${logging.fluentd.port}</port>
+
+        <encoder charset="UTF-8">
+            <pattern>%logger{15}:%L - %msg</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="FLUENT" class="ch.qos.logback.classic.AsyncAppender">
+        <queueSize>500</queueSize>
+        <neverBlock>true</neverBlock>
+        <maxFlushTime>15000</maxFlushTime>
+        <includeCallerData>false</includeCallerData>
+        <appender-ref ref="FLUENT_SYNC" />
+    </appender>
+</included>

+ 50 - 0
auction-order/src/main/resources/logback.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%X{TRACE_ID}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
+    <springProperty scope="context" name="logging.fluentd.enabled" source="logging.fluentd.enabled"/>
+    <springProperty scope="context" name="logging.console.enabled" source="logging.console.enabled"/>
+    <springProperty scope="context" name="logging.fluentd.host" source="logging.fluentd.host"/>
+    <springProperty scope="context" name="logging.fluentd.port" source="logging.fluentd.port"/>
+    <define name="hostname" class="com.poyee.util.CanonicalHostNamePropertyDefiner"/>
+
+    <if condition='p("logging.fluentd.enabled").equals("true")'>
+        <then>
+            <include resource="logback-fluentd.xml" />
+        </then>
+    </if>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <logger name="com.poyee.framework" level="info">
+        <if condition='p("logging.console.enabled").equals("true")'>
+            <then>
+                <appender-ref ref="console" />
+            </then>
+        </if>
+    </logger>
+    <!-- Spring日志级别控制  -->
+    <logger name="org.springframework" level="warn" />
+    <!-- Spring日志级别控制  -->
+<!--    <logger name="com.baomidou" level="debug" />-->
+    <!--系统操作日志-->
+    <root level="info">
+        <if condition='p("logging.console.enabled").equals("true")'>
+            <then>
+                <appender-ref ref="console" />
+            </then>
+        </if>
+        <if condition='p("logging.fluentd.enabled").equals("true")'>
+            <then>
+                <appender-ref ref="FLUENT"/>
+            </then>
+        </if>
+    </root>
+</configuration>

+ 37 - 0
auction-order/src/main/resources/mapper/AuctionOrderListMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.auctionorder.mapper.AuctionOrderListMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.poyee.auctionorder.entity.AuctionOrderList">
+        <id column="id" property="id" />
+        <result column="order_id" property="orderId" />
+        <result column="order_no" property="orderNo" />
+        <result column="merchant_id" property="merchantId" />
+        <result column="auction_id" property="eventId" />
+        <result column="user_id" property="userId" />
+        <result column="goods_id" property="goodsId" />
+        <result column="goods_code" property="goodsCode" />
+        <result column="goods_name" property="name" />
+        <result column="num" property="num" />
+        <result column="imgs" property="imgs" />
+        <result column="unint_price" property="amount" />
+        <result column="total_price" property="totalAmount" />
+        <result column="commission" property="commissionAmount" />
+        <result column="remark" property="remark" />
+        <result column="prop1" property="prop1" />
+        <result column="prop2" property="prop2" />
+        <result column="prop3" property="prop3" />
+        <result column="prop4" property="prop4" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, order_id, order_no, merchant_id, auction_id, user_id, goods_id, goods_code, goods_name, num, imgs, unint_price, total_price, commission, remark, prop1, prop2, prop3, prop4, create_time, create_by, update_time, update_by
+    </sql>
+
+</mapper>

+ 65 - 0
auction-order/src/main/resources/mapper/AuctionOrderMapper.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.auctionorder.mapper.AuctionOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.poyee.auctionorder.entity.AuctionOrder">
+        <id column="id" property="id" />
+        <result column="merchant_id" property="shopId" />
+        <result column="user_id" property="accountId" />
+        <result column="user_account" property="account" />
+        <result column="order_type" property="orderType" />
+        <result column="order_no" property="orderNo" />
+        <result column="auction_id" property="eventId" />
+        <result column="auction_code" property="auctionCode" />
+        <result column="auction_name" property="auctionName" />
+        <result column="auction_type" property="auctionType" />
+        <result column="pay_category" property="payCategory" />
+        <result column="point" property="point" />
+        <result column="purchase_count" property="num" />
+        <result column="total_price" property="totalPrice" />
+        <result column="actual_payable" property="actualPayable" />
+        <result column="coupon" property="coupon" />
+        <result column="discount" property="discount" />
+        <result column="pay_time_limit" property="payTimeLimit" />
+        <result column="status" property="status" />
+        <result column="del_flg" property="delFlg" />
+        <result column="payment_type" property="paymentType" />
+        <result column="payment_sub_type" property="paymentSubType" />
+        <result column="trade_no" property="tradeNo" />
+        <result column="pay_data" property="payData" />
+        <result column="payment_status" property="paymentStatus" />
+        <result column="payment_num" property="paymentNum" />
+        <result column="payment_time" property="paymentTime" />
+        <result column="payment_success_time" property="paymentSuccessTime" />
+        <result column="payment_msg" property="paymentMsg" />
+        <result column="refund_no" property="refundNo" />
+        <result column="refund_status" property="refundStatus" />
+        <result column="refund_time" property="refundTime" />
+        <result column="refund_success_time" property="refundSuccessTime" />
+        <result column="refund_msg" property="refundMsg" />
+        <result column="remark" property="remark" />
+        <result column="msg" property="msg" />
+        <result column="prop1" property="prop1" />
+        <result column="prop2" property="prop2" />
+        <result column="prop3" property="prop3" />
+        <result column="prop4" property="prop4" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="mode" property="mode" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, merchant_id, user_id, user_account, order_type, order_no, auction_id, auction_code, auction_name, auction_type, pay_category, point, purchase_count, total_price, actual_payable, coupon, discount, pay_time_limit, status, del_flg, payment_type, payment_sub_type, trade_no, pay_data, payment_status, payment_num, payment_time, payment_success_time, payment_msg, refund_no, refund_status, refund_time, refund_success_time, refund_msg, remark, msg, prop1, prop2, prop3, prop4, create_time, create_by, update_time, update_by,mode
+    </sql>
+
+    <!--<select id="selectList" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>
+        from auction_order
+    </select>-->
+
+</mapper>

+ 5 - 0
auction-order/src/main/resources/mapper/IBaseMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.base.mapper.IBaseMapper">
+
+</mapper>

+ 232 - 0
auction-order/src/main/resources/mapper/SysBaseMapper.xml

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.base.mapper.SysBaseMapper">
+
+    <resultMap type="com.poyee.base.dto.SysFinanceDto" id="SysFinanceResult">
+        <id property="id"    column="id"    />
+        <result property="type"    column="type"    />
+        <result property="groupInfoId"    column="group_info_id"    />
+        <result property="groupInfoName"    column="group_info_name"    />
+        <result property="groupInfoCode"    column="group_info_code"    />
+        <result property="merchantId"    column="merchant_id"    />
+        <result property="merchantName"    column="merchant_name"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="userPhone"    column="user_phone"    />
+        <result property="orderNo"    column="order_no"    />
+        <result property="purchaseCount"    column="purchase_count"    />
+        <result property="accountsPayable"    column="accounts_payable"    />
+        <result property="actualPayment"    column="actual_payment"    />
+        <result property="paymentType"    column="payment_type"    />
+        <result property="paymentNum"    column="payment_num"    />
+        <result property="paymentTime"    column="payment_time"    />
+        <result property="couponId"    column="coupon_id"    />
+        <result property="coupon"    column="coupon"    />
+        <result property="discount"    column="discount"    />
+        <result property="prepayId"    column="prepay_id"    />
+        <result property="paymentEvid"    column="payment_evid"    />
+        <result property="paymentStatus"    column="payment_status"    />
+        <result property="paymentStatusDesc"    column="payment_status_desc"    />
+        <result property="paymentBankType"    column="payment_bank_type"    />
+        <result property="paymentSuccessTime"    column="payment_success_time"    />
+        <result property="refundId"    column="refund_id"    />
+        <result property="refundFee"    column="refund_fee"    />
+        <result property="refundTime"    column="refund_time"    />
+        <result property="anonymous"    column="anonymous"    />
+        <result property="pickUpType"    column="pick_up_type"    />
+        <result property="shippingAddressId"    column="shipping_address_id"    />
+        <result property="shippingAddressLinkname"    column="shipping_address_linkname"    />
+        <result property="shippingAddress"    column="shipping_address"    />
+        <result property="shippingAddressPhone"    column="shipping_address_phone"    />
+        <result property="courierNum"    column="courier_num"    />
+        <result property="curierCompany"    column="curier_company"    />
+        <result property="outRefundNo"    column="out_refund_no"    />
+        <result property="shipTime"    column="ship_time"    />
+        <result property="invoiceOrgType"    column="invoice_org_type"    />
+        <result property="invoiceTitle"    column="invoice_title"    />
+        <result property="invoiceTaxNo"    column="invoice_tax_no"    />
+        <result property="delFlg"    column="del_flg"    />
+        <result property="status"    column="status"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+    <!--    根据编码查询财务信息-->
+    <select id="getFinanceByOrderNo" parameterType="object" resultMap="SysFinanceResult">
+        select
+        *
+        from
+        sys_finance
+        where
+        order_no = #{orderNo}
+        <if test="type != null and type != ''"> and type = #{type}</if>
+        order by id desc
+    </select>
+<!--    更新财务对账表-->
+    <update id="updateSysFinance" parameterType="object">
+        update sys_finance
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="groupInfoId != null">group_info_id = #{groupInfoId},</if>
+            <if test="groupInfoName != null">group_info_name = #{groupInfoName},</if>
+            <if test="groupInfoCode != null">group_info_code = #{groupInfoCode},</if>
+            <if test="merchantId != null">merchant_id = #{merchantId},</if>
+            <if test="merchantName != null">merchant_name = #{merchantName},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="userName != null">user_name = #{userName},</if>
+            <if test="userPhone != null">user_phone = #{userPhone},</if>
+            <if test="orderNo != null">order_no = #{orderNo},</if>
+            <if test="purchaseCount != null">purchase_count = #{purchaseCount},</if>
+            <if test="accountsPayable != null">accounts_payable = #{accountsPayable},</if>
+            <if test="actualPayment != null">actual_payment = #{actualPayment},</if>
+            <if test="paymentType != null">payment_type = #{paymentType},</if>
+            <if test="paymentNum != null">payment_num = #{paymentNum},</if>
+            <if test="paymentTime != null">payment_time = #{paymentTime},</if>
+            <if test="couponId != null">coupon_id = #{couponId},</if>
+            <if test="coupon != null">coupon = #{coupon},</if>
+            <if test="discount != null">discount = #{discount},</if>
+            <if test="prepayId != null">prepay_id = #{prepayId},</if>
+            <if test="paymentEvid != null">payment_evid = #{paymentEvid},</if>
+            <if test="paymentStatus != null">payment_status = #{paymentStatus},</if>
+            <if test="paymentStatusDesc != null">payment_status_desc = #{paymentStatusDesc},</if>
+            <if test="paymentBankType != null">payment_bank_type = #{paymentBankType},</if>
+            <if test="paymentSuccessTime != null">payment_success_time = #{paymentSuccessTime},</if>
+            <if test="refundId != null">refund_id = #{refundId},</if>
+            <if test="refundFee != null">refund_fee = #{refundFee},</if>
+            <if test="refundTime != null">refund_time = #{refundTime},</if>
+            <if test="anonymous != null">anonymous = #{anonymous},</if>
+            <if test="pickUpType != null">pick_up_type = #{pickUpType},</if>
+            <if test="shippingAddressId != null">shipping_address_id = #{shippingAddressId},</if>
+            <if test="shippingAddressLinkname != null">shipping_address_linkname = #{shippingAddressLinkname},</if>
+            <if test="shippingAddress != null">shipping_address = #{shippingAddress},</if>
+            <if test="shippingAddressPhone != null">shipping_address_phone = #{shippingAddressPhone},</if>
+            <if test="courierNum != null">courier_num = #{courierNum},</if>
+            <if test="curierCompany != null">curier_company = #{curierCompany},</if>
+            <if test="outRefundNo != null">out_refund_no = #{outRefundNo},</if>
+            <if test="shipTime != null">ship_time = #{shipTime},</if>
+            <if test="invoiceOrgType != null">invoice_org_type = #{invoiceOrgType},</if>
+            <if test="invoiceTitle != null">invoice_title = #{invoiceTitle},</if>
+            <if test="invoiceTaxNo != null">invoice_tax_no = #{invoiceTaxNo},</if>
+            <if test="delFlg != null">del_flg = #{delFlg},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+<!--    新增财务对账-->
+    <insert id="insertSysFinance" parameterType="object">
+        insert into sys_finance
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="type != null">type,</if>
+            <if test="groupInfoId != null">group_info_id,</if>
+            <if test="groupInfoName != null">group_info_name,</if>
+            <if test="groupInfoCode != null">group_info_code,</if>
+            <if test="merchantId != null">merchant_id,</if>
+            <if test="merchantName != null">merchant_name,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="userPhone != null">user_phone,</if>
+            <if test="orderNo != null">order_no,</if>
+            <if test="purchaseCount != null">purchase_count,</if>
+            <if test="accountsPayable != null">accounts_payable,</if>
+            <if test="actualPayment != null">actual_payment,</if>
+            <if test="paymentType != null">payment_type,</if>
+            <if test="paymentNum != null">payment_num,</if>
+            <if test="paymentTime != null">payment_time,</if>
+            <if test="couponId != null">coupon_id,</if>
+            <if test="coupon != null">coupon,</if>
+            <if test="discount != null">discount,</if>
+            <if test="prepayId != null">prepay_id,</if>
+            <if test="paymentEvid != null">payment_evid,</if>
+            <if test="paymentStatus != null">payment_status,</if>
+            <if test="paymentStatusDesc != null">payment_status_desc,</if>
+            <if test="paymentBankType != null">payment_bank_type,</if>
+            <if test="paymentSuccessTime != null">payment_success_time,</if>
+            <if test="refundId != null">refund_id,</if>
+            <if test="refundFee != null">refund_fee,</if>
+            <if test="refundTime != null">refund_time,</if>
+            <if test="anonymous != null">anonymous,</if>
+            <if test="pickUpType != null">pick_up_type,</if>
+            <if test="shippingAddressId != null">shipping_address_id,</if>
+            <if test="shippingAddressLinkname != null">shipping_address_linkname,</if>
+            <if test="shippingAddress != null">shipping_address,</if>
+            <if test="shippingAddressPhone != null">shipping_address_phone,</if>
+            <if test="courierNum != null">courier_num,</if>
+            <if test="curierCompany != null">curier_company,</if>
+            <if test="outRefundNo != null">out_refund_no,</if>
+            <if test="shipTime != null">ship_time,</if>
+            <if test="invoiceOrgType != null">invoice_org_type,</if>
+            <if test="invoiceTitle != null">invoice_title,</if>
+            <if test="invoiceTaxNo != null">invoice_tax_no,</if>
+            <if test="delFlg != null">del_flg,</if>
+            <if test="status != null">status,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="tradeNo != null">trade_no,</if>
+            <if test="closePaymentTime != null">close_payment_time,</if>
+            <if test="paymentSubType != null">payment_sub_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="type != null">#{type},</if>
+            <if test="groupInfoId != null">#{groupInfoId},</if>
+            <if test="groupInfoName != null">#{groupInfoName},</if>
+            <if test="groupInfoCode != null">#{groupInfoCode},</if>
+            <if test="merchantId != null">#{merchantId},</if>
+            <if test="merchantName != null">#{merchantName},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="userPhone != null">#{userPhone},</if>
+            <if test="orderNo != null">#{orderNo},</if>
+            <if test="purchaseCount != null">#{purchaseCount},</if>
+            <if test="accountsPayable != null">#{accountsPayable},</if>
+            <if test="actualPayment != null">#{actualPayment},</if>
+            <if test="paymentType != null">#{paymentType},</if>
+            <if test="paymentNum != null">#{paymentNum},</if>
+            <if test="paymentTime != null">#{paymentTime},</if>
+            <if test="couponId != null">#{couponId},</if>
+            <if test="coupon != null">#{coupon},</if>
+            <if test="discount != null">#{discount},</if>
+            <if test="prepayId != null">#{prepayId},</if>
+            <if test="paymentEvid != null">#{paymentEvid},</if>
+            <if test="paymentStatus != null">#{paymentStatus},</if>
+            <if test="paymentStatusDesc != null">#{paymentStatusDesc},</if>
+            <if test="paymentBankType != null">#{paymentBankType},</if>
+            <if test="paymentSuccessTime != null">#{paymentSuccessTime},</if>
+            <if test="refundId != null">#{refundId},</if>
+            <if test="refundFee != null">#{refundFee},</if>
+            <if test="refundTime != null">#{refundTime},</if>
+            <if test="anonymous != null">#{anonymous},</if>
+            <if test="pickUpType != null">#{pickUpType},</if>
+            <if test="shippingAddressId != null">#{shippingAddressId},</if>
+            <if test="shippingAddressLinkname != null">#{shippingAddressLinkname},</if>
+            <if test="shippingAddress != null">#{shippingAddress},</if>
+            <if test="shippingAddressPhone != null">#{shippingAddressPhone},</if>
+            <if test="courierNum != null">#{courierNum},</if>
+            <if test="curierCompany != null">#{curierCompany},</if>
+            <if test="outRefundNo != null">#{outRefundNo},</if>
+            <if test="shipTime != null">#{shipTime},</if>
+            <if test="invoiceOrgType != null">#{invoiceOrgType},</if>
+            <if test="invoiceTitle != null">#{invoiceTitle},</if>
+            <if test="invoiceTaxNo != null">#{invoiceTaxNo},</if>
+            <if test="delFlg != null">#{delFlg},</if>
+            <if test="status != null">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="tradeNo != null">#{tradeNo},</if>
+            <if test="closePaymentTime != null">#{closePaymentTime},</if>
+            <if test="paymentSubType != null">#{paymentSubType},</if>
+        </trim>
+    </insert>
+</mapper>

+ 13 - 0
auction-order/src/test/java/com/poyee/auctionorder/AuctionOrderApplicationTests.java

@@ -0,0 +1,13 @@
+package com.poyee.auctionorder;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class AuctionOrderApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 312 - 0
pom.xml

@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.17.RELEASE</version>
+    </parent>
+
+    <groupId>com.poyee</groupId>
+    <artifactId>poyee</artifactId>
+    <version>1.0.0</version>
+    <packaging>pom</packaging>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
+        <druid.version>1.2.1</druid.version>
+        <swagger.version>2.9.2</swagger.version>
+        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
+        <fastjson.version>1.2.74</fastjson.version>
+        <oshi.version>5.2.5</oshi.version>
+        <commons.io.version>2.5</commons.io.version>
+        <dozer.version>6.5.2</dozer.version>
+        <mybatis_plus.version>3.5.2</mybatis_plus.version>
+        <skipTests>true</skipTests>
+        <model.version>1.0.0</model.version>
+        <springboot.version>2.1.17.RELEASE</springboot.version>
+    </properties>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-web</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+            <!-- SpringBoot 拦截器 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-aop</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-validation</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjrt</artifactId>
+                <version>1.9.6</version>
+            </dependency>
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjweaver</artifactId>
+                <version>1.9.6</version>
+            </dependency>
+            <!--        热更新-->
+            <!--<dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-devtools</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>-->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>1.18.12</version>
+                <optional>true</optional>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-test</artifactId>
+                <version>${springboot.version}</version>
+                <scope>test</scope>
+            </dependency>
+
+            <!--阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+            <!-- pagehelper 分页插件 -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.boot.version}</version>
+            </dependency>
+            <!-- swagger2-->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>swagger-bootstrap-ui</artifactId>
+                <version>1.9.5</version>
+            </dependency>
+
+            <!-- 自定义验证注解 -->
+            <!--<dependency>
+                <groupId>javax.validation</groupId>
+                <artifactId>validation-api</artifactId>
+            </dependency>-->
+            <!--io常用工具类 -->
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons.io.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.postgresql</groupId>
+                <artifactId>postgresql</artifactId>
+                <version>42.2.16</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity</artifactId>
+                <version>1.7</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis_plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generator</artifactId>
+                <version>${mybatis_plus.version}</version>
+            </dependency>
+            <!-- <dependency>
+                 <groupId>javax.persistence</groupId>
+                 <artifactId>javax.persistence-api</artifactId>
+                 <version>2.2</version>
+             </dependency>-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-jdbc</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+            <!-- Spring Data Redis -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-redis</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+
+            <!--jwt 鉴权-->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>3.3.0</version>
+            </dependency>
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>0.9.0</version>
+            </dependency>
+
+            <!-- redis 环境 -->
+            <dependency>
+                <groupId>org.springframework.session</groupId>
+                <artifactId>spring-session-data-redis</artifactId>
+                <version>2.1.13.RELEASE</version>
+            </dependency>
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson</artifactId>
+                <version>3.5.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-amqp</artifactId>
+                <version>${springboot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.codehaus.janino</groupId>
+                <artifactId>janino</artifactId>
+                <version>3.0.12</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sndyuk</groupId>
+                <artifactId>logback-more-appenders</artifactId>
+                <version>1.8.5</version>
+            </dependency>
+            <dependency>
+                <groupId>org.fluentd</groupId>
+                <artifactId>fluent-logger</artifactId>
+                <version>0.3.4</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-test-autoconfigure</artifactId>
+                <version>2.1.17.RELEASE</version>
+                <scope>test</scope>
+            </dependency>
+            <!--foest-->
+            <dependency>
+                <groupId>com.dtflys.forest</groupId>
+                <artifactId>forest-spring-boot-starter</artifactId>
+                <version>1.5.24</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>httpclient-cache</artifactId>
+                        <groupId>org.apache.httpcomponents</groupId>
+                    </exclusion>
+                    <exclusion>
+                        <artifactId>commons-logging</artifactId>
+                        <groupId>commons-logging</groupId>
+                    </exclusion>
+                    <exclusion>
+                        <artifactId>commons-io</artifactId>
+                        <groupId>commons-io</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>com.github.dozermapper</groupId>
+                <artifactId>dozer-core</artifactId>
+                <version>${dozer.version}</version>
+            </dependency>
+            <!-- JSON工具类 -->
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>2.9.10.6</version>
+            </dependency>
+            <!-- 阿里JSON解析器 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jpedal</groupId>
+                <artifactId>OpenViewerFX</artifactId>
+                <version>6.6.14</version>
+            </dependency>
+            <!--基础配置-->
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>poyee-base</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>poyee-checklist</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>poyee-system</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>poyee-courier</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>auction-order</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>poyee-pay</artifactId>
+                <version>${model.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>poyee-base</module>
+        <module>auction-order</module>
+        <module>poyee-pay</module>
+        <module>poyee-checklist</module>
+        <module>poyee-system</module>
+        <module>poyee-courier</module>
+    </modules>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <!--<compilerArguments>
+                        <bootclasspath>${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar</bootclasspath>
+                    </compilerArguments>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 259 - 0
poyee-base/pom.xml

@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>poyee</artifactId>
+        <groupId>com.poyee</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>poyee-base</artifactId>
+    <name>基础配置</name>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
+        <druid.version>1.2.1</druid.version>
+        <swagger.version>2.9.2</swagger.version>
+        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
+        <fastjson.version>1.2.74</fastjson.version>
+        <oshi.version>5.2.5</oshi.version>
+        <commons.io.version>2.5</commons.io.version>
+        <dozer.version>6.5.2</dozer.version>
+        <mybatis_plus.version>3.5.2</mybatis_plus.version>
+        <skipTests>true</skipTests>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+        <!--        热更新-->
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--阿里数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+        <!-- pagehelper 分页插件 -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>${pagehelper.boot.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>jsqlparser</artifactId>
+                    <groupId>com.github.jsqlparser</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- swagger2-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.5</version>
+        </dependency>
+
+        <!-- 自定义验证注解 -->
+        <!--<dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>-->
+        <!--io常用工具类 -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons.io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+            <version>1.7</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis_plus.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>${mybatis_plus.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.yulichang</groupId>
+            <artifactId>mybatis-plus-join-boot-starter</artifactId>
+            <version>1.4.2.2</version>
+        </dependency>
+
+        <!-- <dependency>
+             <groupId>javax.persistence</groupId>
+             <artifactId>javax.persistence-api</artifactId>
+             <version>2.2</version>
+         </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jdbc</artifactId>
+        </dependency>
+        <!-- Spring Data Redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <!--jwt 鉴权-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+
+        <!-- redis 环境 -->
+        <dependency>
+            <groupId>org.springframework.session</groupId>
+            <artifactId>spring-session-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+            <version>3.0.12</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sndyuk</groupId>
+            <artifactId>logback-more-appenders</artifactId>
+            <version>1.8.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.fluentd</groupId>
+            <artifactId>fluent-logger</artifactId>
+            <version>0.3.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test-autoconfigure</artifactId>
+            <version>2.1.17.RELEASE</version>
+            <scope>test</scope>
+        </dependency>
+        <!--foest-->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.24</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>httpclient-cache</artifactId>
+                    <groupId>org.apache.httpcomponents</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-logging</artifactId>
+                    <groupId>commons-logging</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-io</artifactId>
+                    <groupId>commons-io</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.github.dozermapper</groupId>
+            <artifactId>dozer-core</artifactId>
+            <version>${dozer.version}</version>
+        </dependency>
+        <!-- JSON工具类 -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.11</version>
+        </dependency>
+        <!-- 阿里JSON解析器 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jpedal</groupId>
+            <artifactId>OpenViewerFX</artifactId>
+            <version>6.6.14</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun</groupId>
+            <artifactId>rt</artifactId>
+            <version>0.0.1</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/rt.jar</systemPath>
+        </dependency>
+<!--minio 上传-->
+        <!--<dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.0.3</version>
+        </dependency>-->
+    </dependencies>
+
+
+</project>

+ 107 - 0
poyee-base/src/main/java/com/poyee/base/controller/BaseController.java

@@ -0,0 +1,107 @@
+package com.poyee.base.controller;
+
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.Result;
+import com.poyee.base.dto.UserInfo;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.base.service.BaseService;
+import com.poyee.util.DateUtils;
+import com.poyee.util.ServletUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ *
+ */
+@Slf4j
+public abstract class BaseController<S extends BaseService<T ,R>, T extends BaseEntity, R >   {
+
+    @Autowired
+    protected S baseService;
+
+    /**
+     * 日志
+     * @param label
+     * @param obj
+     */
+    public void console(String label, Object obj ){
+        //当前操作用户 及 角色 ,操作时间
+        String userName = "游客";
+        String roleCode = "游客";
+        try{
+            UserInfo userInfo = ServletUtils.getUserInfo();
+            String name = StringUtils.isNotBlank(userInfo.getDisplayName()) ? userInfo.getDisplayName() : userInfo.getSub();
+            if(StringUtils.isBlank(name)){
+                userName = Objects.nonNull(userInfo.getId()) ? "用户id:"+userInfo.getId() : userName;
+            }
+            String role = userInfo.getRoleCode();
+            if (StringUtils.isBlank(role)) {
+                roleCode = Objects.nonNull(userInfo.getMerchantId()) ? "商户" : roleCode;
+            }
+        } catch (Exception e) {
+            log.error("当前用户[{}] 角色【{}】获取用户信息异常", userName, roleCode, e);
+        } finally {
+            log.info("{} {}\n" + " 当前用户[{}] 角色【{}】操作时间[{}] ", label, obj,
+                     userName, roleCode , DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
+        }
+    }
+
+    public Result<R> listPage(T entity,boolean checkUser){
+        log.info(" 请求参数 》》》 {}",entity);
+        Result<R> result = baseService.listPage(entity,checkUser);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+    public Result<R> info(Integer id){
+        log.info(" 请求参数 》》》 {}",id);
+        Result<R> result = baseService.info(id);
+        log.info(" 返回数据 》》》 {}",result);
+        return result;
+    }
+
+    public Result<R> edit(T entity){
+        log.info(" 请求参数 》》》 {}",entity);
+        boolean update = baseService.updateById(entity);
+        log.info(" 返回数据 》》》 {}",update);
+        return update ? Result.ok() : Result.error("更新失败");
+    }
+    /**
+     * 获取request
+     */
+    public AppBaseUser getAppUserInfo() {
+        return baseService.getAppUserInfo();
+    }
+    /**
+     * 获取request
+     */
+    public HttpServletRequest getRequest()
+    {
+        return ServletUtils.getRequest();
+    }
+    /**
+     * 获取response
+     */
+    public HttpServletResponse getResponse()
+    {
+        return ServletUtils.getResponse();
+    }
+
+    /**
+     * 获取session
+     */
+    public HttpSession getSession()
+    {
+        return getRequest().getSession();
+    }
+
+
+
+}

+ 163 - 0
poyee-base/src/main/java/com/poyee/base/dto/AppBaseUser.java

@@ -0,0 +1,163 @@
+package com.poyee.base.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.poyee.base.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author lsz
+ * @since 2022-12-09
+ */
+@Data
+@ApiModel(value = "AppBaseUser对象", description = "")
+public class AppBaseUser extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("id")
+    private Integer id;
+
+    @ApiModelProperty("所属程序")
+    private String appid;
+
+    @ApiModelProperty("真实姓名")
+    private String realname;
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("积分")
+    private Long point;
+
+    @ApiModelProperty("会员等级")
+    private Integer level;
+
+    @ApiModelProperty("生日")
+    private LocalDateTime birthday;
+
+    @ApiModelProperty("性别")
+    private Integer sex;
+
+    @ApiModelProperty("openid")
+    private String openid;
+
+    @ApiModelProperty("unionid")
+    private String unionid;
+
+    @ApiModelProperty("注册渠道")
+    private String registerChannel;
+
+    @ApiModelProperty("状态")
+    private Integer status;
+
+    @ApiModelProperty("删除标记")
+    private Integer delFlg;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建人")
+    private String createBy;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新人")
+    private String updateBy;
+
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("账号")
+    private String username;
+
+    @ApiModelProperty("会员成长值")
+    private Integer growthNum;
+
+    @ApiModelProperty("会员码")
+    @TableField("code")
+    private String code;
+
+    @ApiModelProperty("是否接受通知消息,1接受,0拒绝")
+    private Integer notifyFlag;
+
+    @ApiModelProperty("app极光注册id")
+    private String smsRegisterId;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("notify_type")
+    private String notifyType;
+
+    @ApiModelProperty("通过人脸识别标志:1")
+    private Integer faceVerify;
+
+    @ApiModelProperty("支付开关")
+    private Integer openPsd;
+
+    @ApiModelProperty("支付密码")
+    private String payPsd;
+
+    @ApiModelProperty("登陆密码")
+    private String loginPsd;
+
+    @ApiModelProperty("是否拒绝自提")
+    private Integer refusePickUp;
+
+    @ApiModelProperty("备用")
+    private String prop1;
+
+    @ApiModelProperty("备用")
+    private String prop2;
+
+    @ApiModelProperty("备用")
+    private String prop3;
+
+    @ApiModelProperty("备用")
+    private String prop4;
+
+    @ApiModelProperty("悬浮窗口开关")
+    private Integer windowOpen;
+
+    @ApiModelProperty("身份证姓名")
+    private String certName;
+
+    @ApiModelProperty("支付宝账号")
+    private String alipayAccount;
+
+    @ApiModelProperty("开票权限")
+    private Integer openInvoice;
+
+    @ApiModelProperty("编辑黑名单")
+    private Integer blacklist;
+
+    @ApiModelProperty("身份证号")
+    private String idCard;
+    //手机区号
+    private String dailingCode  ;
+
+    /**
+     * 用户身份证信息
+     **/
+    @ApiModelProperty("用户身份证信息")
+    private String userCertData;
+
+    private String phone;
+
+    private List<Pays> pays;
+
+}

+ 13 - 0
poyee-base/src/main/java/com/poyee/base/dto/Pays.java

@@ -0,0 +1,13 @@
+package com.poyee.base.dto;
+
+import lombok.Data;
+
+/**
+ * 高频支付标记
+ */
+@Data
+public class Pays {
+    private String payType;
+
+    private String paySubType;
+}

+ 403 - 0
poyee-base/src/main/java/com/poyee/base/dto/Result.java

@@ -0,0 +1,403 @@
+package com.poyee.base.dto;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.common.exception.BaseException;
+import com.poyee.util.GenericlassUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.*;
+
+@Data
+@ApiModel(description = "返回基础对象")
+@JsonIgnoreProperties(value = {"dataList","beanData","nullList"})
+public class Result<T> implements Serializable {
+
+    private static long serializable = 1L;
+    //請求狀態
+    @ApiModelProperty(value = "success" ,dataType= "boolean" , notes = "默认:true",example="true")
+    private boolean success = true;
+    //請求狀態碼
+    @ApiModelProperty(value = "code" ,dataType= "integer" , notes = "默认:0",example="0")
+    private Integer code = 0;
+    //請求描述
+    @ApiModelProperty(value = "msg" ,dataType= "string" , notes = "默认:成功",example="成功")
+    private String msg = "成功";
+    //返回數據
+    @ApiModelProperty(value = "data"  )
+    private T data;
+    //返回數據
+    @ApiModelProperty(value = "result"  )
+    private Map result;
+
+    @ApiModelProperty(value = "total"  )
+    private Long total;
+    @JsonIgnore
+    List<Object> nullList = new ArrayList<>();
+
+    public T getData(){
+        if(null != data && data.getClass().getName().contains("JSONObject")){
+            return JSONObject.parseObject(JSONObject.toJSONString(data), getTClass());
+        }
+        return data;
+    }
+    public T getData(Class<T> tClass){
+        if(null != data && data.getClass().getName().contains("JSONObject")){
+            return JSONObject.parseObject(JSONObject.toJSONString(data), tClass);
+        }
+        return data;
+    }
+    public T getBeanData(){
+        if(null != data && data.getClass().getName().contains("JSONObject")){
+            return JSONObject.parseObject(JSONObject.toJSONString(data), getTClass());
+        }
+        return data;
+    }
+
+    public T getDataList(Class<?> tClass){
+        if (null != data && data.getClass().getName().contains("JSONArray")) {
+            return (T) JSONArray.parseArray(JSONObject.toJSONString(data), tClass);
+        } else if(null != data && data.getClass().getName().contains("JSONObject")) {
+            JSONArray array = new JSONArray();
+            array.add(JSONObject.parseObject(JSONObject.toJSONString(data), tClass));
+            return (T) JSONArray.parseArray(JSONObject.toJSONString(array), tClass);
+        }
+        return data;
+    }
+    public List<T> getDataList(){
+        List<T> ts = new ArrayList<>();
+        if (null != data && data.getClass().getName().contains("JSONArray")) {
+            ts = JSONArray.parseArray(JSONObject.toJSONString(data), getTClass());
+            return ts;
+        } else if(null != data && data.getClass().getName().contains("JSONObject")) {
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data));
+            if(jsonObject.isEmpty()){
+                return ts;
+            }
+            ts.add(getData());
+            return ts;
+        } else if(null != data && data.getClass().getName().contains("ArrayList")) {
+            return (List<T>) data;
+        }else{
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data));
+            if(null == jsonObject || jsonObject.isEmpty()){
+                return ts;
+            }
+            ts.add(getData());
+            return ts;
+        }
+    }
+
+
+    public void setCode(Integer code){
+        this.code = code;
+        if(this.code != 0) this.success = false;
+    }
+
+    public Integer getCode(){
+        if(this.code != 0) this.success = false;
+        return this.code;
+    }
+
+    public boolean isSuccess(){
+        return null != this.code && this.code != 0 ? false :true;
+    }
+    /**
+     * 無參
+     * 请求成功
+     * @return
+     */
+    public Result<T> page(Long total,Object obj){
+        Result r = new Result();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setTotal(total);
+        r.setMsg("成功");
+        try{
+            if(total > 0){
+//                r.setData(removeEmptyValue(obj));
+                r.setData(obj);
+            }
+        }catch (Exception e){
+            throw new BaseException("数据转换异常[1002]!");
+        }
+        return r;
+    }
+    /**
+     * 無參
+     * 请求成功
+     * @return
+     */
+    public static Result ok(){
+        Result r = new Result();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        return r;
+    }
+    /**
+     * 無參
+     * 请求成功
+     * @return
+     */
+    public static Result ok(String msg){
+        Result r = new Result();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg(msg);
+        return r;
+    }
+
+    /**
+     * 無參
+     * 请求成功
+     * @return
+     */
+    public static Result<Object> success(){
+        Result<Object> r = new Result<Object>();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        return r;
+    }
+    /**
+     * 请求成功
+     * @param msg
+     * @return
+     */
+    public static Result<Object> success(String msg){
+        Result<Object> r = new Result<Object>();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg(msg);
+        return r;
+    }
+    /**
+     * 请求成功
+     * @param obj
+     * @return
+     */
+    public static<R> Result<R> success(R obj){
+        Result<R> r = new Result<R>();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        try{
+            r.setData(obj);
+        }catch (Exception e){
+            throw new BaseException("数据转换异常[1002]!");
+        }
+        return r;
+    }
+    /**
+     * 请求成功
+     * @param map
+     * @return
+     */
+    public static Result<Object> ok(Map map){
+        Result<Object> r = new Result<Object>();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        r.setData(map);
+        return r;
+    }
+    /**
+     * 请求成功
+     * @param obj
+     * @return
+     */
+    public static Result<Object> ok(Object obj){
+        Result<Object> r = new Result<Object>();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        try{
+            r.setData(obj);
+//            r.setData(removeEmptyValue(obj));
+        }catch (Exception e){
+            throw new BaseException("数据转换异常[1002]!");
+        }
+        return r;
+    }
+    /**
+     * 请求成功
+     * @param obj
+     * @return
+     */
+    public static Result addList(Object obj){
+        Result r = new Result();
+        r.setSuccess(true);
+        r.setCode(0);
+        r.setMsg("成功");
+        try{
+            r.setData(removeEmptyValue(obj));
+        }catch (Exception e){
+            throw new BaseException("数据转换异常[1002]!");
+        }
+        return r;
+    }
+
+    private static Object removeEmptyValue(Object obj){
+        JSONObject json = new JSONObject();
+        try {
+            if(obj.getClass().getName().indexOf("ArrayList") > 0){
+                List<Object> objlist = (List<Object>) obj;
+                JSONArray jsonArray = new JSONArray();
+                if(!objlist.isEmpty()){
+                    objlist.forEach(item->{
+                        jsonArray.add(removeEmptyValue(item));
+                    });
+                    return jsonArray;
+                }
+            } else {
+                json = (JSONObject) JSONObject.toJSON(obj);
+                JSONObject finalJson = json;
+                Arrays.stream(obj.getClass().getDeclaredFields()).forEach(field -> {
+                    ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
+                    if (null != annotation) {
+                        boolean b = annotation.readOnly();
+                        if (!b) {
+                            finalJson.remove(field.getName());
+                        }
+                    }
+                });
+
+                BaseEntity.types.forEach(s -> {
+                    finalJson.remove(s);
+                });
+                json = finalJson;
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new BaseException("数据转换异常[1001]!");
+        }
+        return json;
+    }
+
+    /**
+     * 失败
+     * @return
+     */
+    public static <R> Result<R> error(){
+        Result<R> r = new Result();
+        r.setSuccess(false);
+        r.setCode(-1);
+        r.setMsg("请求失败");
+        return r;
+    }
+
+    /**
+     * 返回失败信息
+     * @param msg
+     * @return
+     */
+    public static Result error(String msg){
+        Result r = new Result();
+        r.setSuccess(false);
+        r.setCode(-1);
+        r.setMsg(msg);
+        return r;
+    }
+
+    /**
+     * 返回失败信息
+     * @param code
+     * @param msg
+     * @return
+     */
+    public static <R> Result<R> error(Integer code,String msg){
+        Result<R> r = Result.error();
+        r.setSuccess(false);
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    /**
+     * map 集合put 数据
+     * @param key
+     * @param value
+     * @return
+     */
+    public Result put(String key ,Object value){
+        if(null == this.result ) this.result = new HashMap();
+        this.result.put(key,value);
+        return this;
+    }
+
+    /**
+     * json 集合put 数据
+     * @param json
+     * @return
+     */
+    public Result putDataJSON(T json){
+        this.setData(json);
+        return this;
+    }
+
+    /**
+     * json 集合put 数据
+     * @param json
+     * @return
+     */
+    public Result addData(String key,T json){
+        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(this.data));
+        if(Objects.isNull(jsonObject)){
+            jsonObject = new JSONObject();
+        }
+        jsonObject.put(key,json);
+        this.setData((T) jsonObject);
+        return this;
+    }
+    /**
+     * 取值
+     * @param key
+     * @return
+     */
+    public Object get(String key){
+        if(null != this.result && !this.result.isEmpty()){
+            return this.result.get(key);
+        }else{
+            JSONObject jsonObject = this.toJson();
+            if(null != jsonObject) return jsonObject.get(key);
+            else return null;
+        }
+    }
+    /**
+     * 取值
+     * @param key
+     * @return
+     */
+    public String getString(String key){
+        if(null != this.result && !this.result.isEmpty()){
+            return (String) this.result.get(key);
+        }else{
+            JSONObject jsonObject = this.toJson();
+            if(null != jsonObject) return jsonObject.getString(key);
+            else return null;
+        }
+    }
+
+    /**
+     * 转换为json 值
+     * @return
+     */
+    public JSONObject toJson(){
+        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(this);
+        return jsonObject;
+    }
+
+    private Class<T> getTClass(){
+        return (Class<T>) GenericlassUtil.getActualTypeArgument(this.getClass(), 0);
+    }
+
+
+
+}

+ 67 - 0
poyee-base/src/main/java/com/poyee/base/dto/UserInfo.java

@@ -0,0 +1,67 @@
+package com.poyee.base.dto;
+
+import com.poyee.common.enums.DataAuth;
+import com.poyee.util.StringUtils;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用户信息
+ */
+@Data
+@ToString
+public class UserInfo implements Serializable {
+
+    //id
+    private Integer id;
+    //用户id
+//    private String userId;
+    //用户头像
+    private String avatar;
+    //角色编码
+    private String roleCode;
+    //角色编码
+    private String role;
+    //请求时间
+    private Long iat;
+    //过期时间
+    private Long exp;
+    //名称
+    private String displayName;
+
+    private String sub;
+
+    private String iss;
+
+    private String aud;
+
+    private String nbf;
+
+    private String isFaceVerify;
+
+    private List<String> scope;
+    //商家id
+    private Integer merchantId;
+    //商家头像
+    private String merchantAvatar;
+    //商家名称
+    private String merchantName;
+    /**
+     * 数据权限
+     */
+    private DataAuth dataAuth;
+    //手机区号
+    private String dailingCode = "852";
+
+    public String getRoleCode(){
+        if(StringUtils.isNotBlank(roleCode))
+        {
+            return roleCode;
+        }
+        return role;
+    }
+
+}

+ 53 - 0
poyee-base/src/main/java/com/poyee/base/entity/BaseEntity.java

@@ -0,0 +1,53 @@
+package com.poyee.base.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+@Data
+public class BaseEntity implements Serializable {
+
+    @ApiModelProperty( value = "页码,查询时使用", notes = "查询时使用", reference = "1")
+    @TableField(exist = false)
+    private Integer pageNo = 1;
+
+    @ApiModelProperty(value = "每页数量,查询时使用", notes = "查询时使用", reference = "10")
+    @TableField(exist = false)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty( value = "排序字段,查询时使用", notes = "查询时使用", reference = " createTime ")
+    @TableField(exist = false)
+    private String sidx;
+
+    @ApiModelProperty( value = "排序规则,查询时使用", notes = "查询时使用", reference = " ase ")
+    @TableField(exist = false)
+    private String sord;
+
+    @ApiModelProperty(hidden = true)
+    @TableField(exist = false)
+    private String orderBy ;
+
+    @ApiModelProperty(hidden = true)
+    @TableField(exist = false)
+    private Integer limit ;
+
+    public Integer getLimit (){
+        return (pageNo - 1) * pageSize;
+    }
+
+    @ApiModelProperty( hidden = true)
+    @TableField(exist = false)
+    public static List<String> types = Arrays.asList(new String[]{ "pageNo","pageSize","sidx","sord","orderBy","limit","desensit"});
+
+    public static boolean notIn(String type){
+        if(!types.contains(type)){
+            return true;
+        }
+        return false;
+    }
+
+}

+ 10 - 0
poyee-base/src/main/java/com/poyee/base/mapper/IBaseMapper.java

@@ -0,0 +1,10 @@
+package com.poyee.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface IBaseMapper<T> extends BaseMapper<T> , MPJBaseMapper<T> {
+
+}

+ 49 - 0
poyee-base/src/main/java/com/poyee/base/service/BaseService.java

@@ -0,0 +1,49 @@
+package com.poyee.base.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.Result;
+import com.poyee.base.entity.BaseEntity;
+
+import java.util.List;
+
+public interface BaseService<T extends BaseEntity , R > extends IService<T> {
+
+    public Result<R> listPage(T entity,boolean checkUser);
+
+    public Result<R> listPage(QueryWrapper<T> wrapper, T entity);
+    public Result<R> selectJoinPage(MPJLambdaWrapper<T> wrapper, T entity);
+
+    public Result<R> listPageCheckNotNull(T entity,boolean checkUser,String... isNotNullColumn);
+
+    public List<R> getAllList(T entity,boolean checkUser);
+
+    public Result<R> getListByToken(T entity);
+
+    public Result<R> info(Integer id);
+
+    public Result<T> getOne(T entity);
+
+    public Result<R> getOneDto(T entity);
+
+    public Result<R> getOneDto(T entity,boolean checkUser);
+
+    public Result<R> getOneDtoCheckNotNull(T entity ,boolean checkUser ,String... isNotNullColumn);
+
+    public Result<R> getOneDtoCheckNull(T entity,boolean checkUser ,String... isNullColumn);
+
+    public Result<R> getOneDto(T entity,boolean checkUser,String orderByClum,boolean isAse);
+    //获取登录用户信息
+    public AppBaseUser getAppUserInfo();
+    //获取商家id
+    public Integer getAppUserMerchantId();
+    //验证身份
+    public boolean checkUserAuth(Integer userId, String username, String idCard);
+    //put身份
+    public boolean putUserAuth(Integer userId, String username, String idCard);
+
+    public QueryWrapper<T> checkWrapper(T entity,boolean checkUser);
+
+}

+ 654 - 0
poyee-base/src/main/java/com/poyee/base/service/impl/BaseServiceImpl.java

@@ -0,0 +1,654 @@
+package com.poyee.base.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.poyee.base.dto.AppBaseUser;
+import com.poyee.base.dto.Result;
+import com.poyee.base.dto.UserInfo;
+import com.poyee.base.entity.BaseEntity;
+import com.poyee.base.mapper.IBaseMapper;
+import com.poyee.base.service.BaseService;
+import com.poyee.common.exception.BusinessException;
+import com.poyee.common.exception.ServiceException;
+import com.poyee.redis.util.RedisUtils;
+import com.poyee.util.DateUtils;
+import com.poyee.util.GenericlassUtil;
+import com.poyee.util.ObjectUtil;
+import com.poyee.util.ServletUtils;
+import com.poyee.util.http.HttpClient;
+import com.poyee.util.http.HttpUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+@Slf4j
+@Service
+public abstract class BaseServiceImpl<E extends IBaseMapper<T>, T extends BaseEntity ,R> extends ServiceImpl<E,T> implements BaseService<T,R> {
+
+    @Value("${user.info-url:https://coresvc-dev.hobbystocks.cn/user/}")
+    private String userInfoUrl;
+
+    private final static int max_size = 1000;
+    @Autowired
+    protected RedisUtils redisUtils;
+
+
+    /**
+     * 根据用户id查询用户信息
+     * @param userId
+     * @return
+     */
+    public AppBaseUser getAppUserInfo (Integer userId){
+        AppBaseUser appBaseUser = new AppBaseUser();
+        try {
+            String str = HttpClient.get(userInfoUrl + userId);
+            log.info(" 调用接口查询用户详情信息》》》{} ", str);
+            appBaseUser = JSONObject.parseObject(str, AppBaseUser.class);
+            if(null == appBaseUser){
+                throw new BusinessException(405,"请重新登录[405]!");
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new BusinessException(401,"验证用户信息失败[401]!");
+        }
+        return appBaseUser;
+    }
+
+    /**
+     * 获取请求用户的信息
+     * @return
+     */
+    @Transactional
+    @Override
+    public AppBaseUser getAppUserInfo(){
+        AppBaseUser appBaseUser = new AppBaseUser();
+        UserInfo userInfo = ServletUtils.getUserInfo();
+        if(null == userInfo || null == userInfo.getId()){
+            throw new BusinessException("请重新登录[405]!");
+        }
+        String str = HttpClient.get(userInfoUrl + userInfo.getId());
+        log.info(" 调用接口查询用户详情信息》》》{} ", str);
+        appBaseUser = JSONObject.parseObject(str, AppBaseUser.class);
+        if(null == appBaseUser){
+            throw new BusinessException(405,"请重新登录[405]!");
+        }else if(null != appBaseUser && null != appBaseUser.getStatus() && 500 == appBaseUser.getStatus()){
+            throw new BusinessException(500,"用户登录信息失效,请刷新或重新登录[500]!");
+        }
+        return appBaseUser;
+    }
+    /**
+     * 获取请求用户的信息
+     * @return
+     */
+    @Transactional
+    @Override
+    public Integer getAppUserMerchantId(){
+        Integer merchantId = null;
+        UserInfo userInfo = ServletUtils.getUserInfo();
+        if(null == userInfo){
+            throw new BusinessException("请重新登录[405]!");
+        }
+        merchantId = userInfo.getMerchantId();
+        /*if("shipping".equals(userInfo.getRoleCode())){
+            merchantId = userInfo.getMerchantId();
+        }else{
+            throw new BusinessException("无权限[403]!");
+        }*/
+        if(Objects.isNull(merchantId)){
+            throw new BusinessException("无权限[403]!");
+        }
+        return merchantId;
+    }
+
+    /**
+     * 验证用户的实名认证信息是否正确
+     * @param userId
+     * @param username
+     * @param idCard
+     * @return
+     */
+    public boolean checkUserAuth(Integer userId, String username, String idCard){
+        JSONObject param = new JSONObject();
+        param.put("userId",userId);
+        param.put("certName",username);
+        param.put("idCard",idCard);
+        log.info(" 验证用户实名认证 参数:{} ",param);
+        try {
+            String resultStr = HttpClient.doPost(userInfoUrl + "check_id_card", param);
+            if(StringUtils.isNotEmpty(resultStr)){
+                JSONObject resultJson = JSONObject.parseObject(resultStr);
+                log.info(" 验证用户实名认证:{} ",resultJson);
+                if(200 == resultJson.getInteger("code")){
+                    return true;
+                } else if(426 == resultJson.getInteger("code")){
+                    return false;
+                }else{
+                    throw new ServiceException(resultJson.getString("msg"));
+                }
+            }else{
+                throw new ServiceException("验证用户实名认证异常");
+            }
+        } catch (Exception e) {
+            return true;
+//            throw new ServiceException(e.getMessage());
+        }
+    }
+
+    /**
+     * put用户身份信息
+     * @param userId
+     * @param username
+     * @param idCard
+     * @return
+     */
+    public boolean putUserAuth(Integer userId, String username, String idCard){
+        JSONObject param = new JSONObject();
+        param.put("userId",userId);
+        param.put("certName",username);
+        param.put("idCard",idCard);
+        log.info(" put用户身份信息 参数:{} ",param);
+        try {
+            Map<String ,String > header = new HashMap<>();
+            header.put("Content-Type","application/json");
+            String resultStr = "";
+            if(userInfoUrl.startsWith("https:")){
+                resultStr = HttpUtils.httpsRequest(userInfoUrl + "up_id_card","PUT", JSONObject.toJSONString(param),header);
+            }else{
+                resultStr = HttpUtils.httpRequest(userInfoUrl + "up_id_card","PUT", JSONObject.toJSONString(param),header);
+            }
+            if(StringUtils.isNotEmpty(resultStr)){
+                JSONObject resultJson = JSONObject.parseObject(resultStr);
+                log.info(" put用户身份信息 返回:{} ",resultJson);
+                if(200 == resultJson.getInteger("code")){
+                    return true;
+                } else if(426 == resultJson.getInteger("code")){
+                    return false;
+                }else{
+                    log.error(" 返回描述:{} ",resultJson.getString("msg"));
+                }
+            }else{
+                log.error(" put用户身份信息异常 ");
+            }
+        } catch (Exception e) {
+            log.error(" put用户身份信息异常 {} ",e);
+        }
+        return false;
+    }
+    /**
+     * 分页查询 (使用token用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> listPage(QueryWrapper<T> wrapper, T entity){
+        Integer pageNo = entity.getPageNo();
+        Integer pageSize = entity.getPageSize();
+        String msg = "单次查询最大条数为:"+max_size+"条";
+        Page<T> page = new Page<>(pageNo,pageSize > max_size ? max_size : pageSize);
+        //拼接排序数据
+        if(StringUtils.isNotEmpty(entity.getSidx()) && "desc".equals(entity.getSord())){
+            wrapper = wrapper.orderByDesc(entity.getSidx());
+        }else if(StringUtils.isNotEmpty(entity.getSidx())){
+            wrapper = wrapper.orderByAsc(entity.getSidx());
+        }
+        IPage<T> ipage = page(page, wrapper);
+        return Result.ok(pageSize > max_size ? msg : null)
+                .page(ipage.getTotal(),getDtoList(ipage.getRecords()))
+                ;
+    }
+    /**
+     * 分页查询 (使用token用户信息)
+     *
+     * @param entity
+     * @return
+     */
+    @Override
+    public Result<R> selectJoinPage(MPJLambdaWrapper<T> wrapper, T entity) {
+        Integer pageNo = entity.getPageNo();
+        Integer pageSize = entity.getPageSize();
+        String msg = "单次查询最大条数为:" + max_size + "条";
+        Page<T> page = new Page<>(pageNo, pageSize > max_size ? max_size : pageSize);
+        //拼接排序数据
+        if (StringUtils.isNotEmpty(entity.getSidx()) && "desc".equals(entity.getSord())) {
+            wrapper = wrapper.orderByDesc(entity.getSidx());
+        } else if (StringUtils.isNotEmpty(entity.getSidx())) {
+            wrapper = wrapper.orderByAsc(entity.getSidx());
+        }
+        IPage<R> ipage = baseMapper.selectJoinPage(page, getDtoClass(), wrapper);
+        return Result.ok(pageSize > max_size ? msg : null)
+                     .page(ipage.getTotal(), getDtoList(ipage.getRecords()))
+                ;
+    }
+    /**
+     * 分页查询 (使用token用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> listPage(T entity,boolean checkUser){
+        Integer pageNo = entity.getPageNo();
+        Integer pageSize = entity.getPageSize();
+        String msg = "单次查询最大条数为:"+max_size+"条";
+        Page<T> page = new Page<>(pageNo,pageSize > max_size ? max_size : pageSize);
+        //拼接查询条件
+        QueryWrapper<T> wrapper = checkWrapper(entity,checkUser);
+        //拼接排序数据
+        if(StringUtils.isNotEmpty(entity.getSidx()) && "desc".equals(entity.getSord())){
+            wrapper = wrapper.orderByDesc(entity.getSidx());
+        }else if(StringUtils.isNotEmpty(entity.getSidx())){
+            wrapper = wrapper.orderByAsc(entity.getSidx());
+        }
+        IPage<T> ipage = page(page, wrapper);
+        return Result.ok(pageSize > max_size ? msg : null)
+                .page(ipage.getTotal(),getDtoList(ipage.getRecords()))
+                ;
+    }
+    /**
+     * 分页查询 (使用token用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> listPageCheckNotNull(T entity,boolean checkUser,String... isNotNullColumn){
+        Integer pageNo = entity.getPageNo();
+        Integer pageSize = entity.getPageSize();
+        String msg = "单次查询最大条数为:"+max_size+"条";
+        Page<T> page = new Page<>(pageNo,pageSize > max_size ? max_size : pageSize);
+        //拼接查询条件
+        QueryWrapper<T> wrapper = checkWrapper(entity,checkUser);
+        if(null != isNotNullColumn){
+            QueryWrapper<T> finalWrapper = wrapper;
+            Arrays.asList(isNotNullColumn).forEach(str->{
+                finalWrapper.isNotNull(str);
+            });
+        }
+        //拼接排序数据
+        if(StringUtils.isNotEmpty(entity.getSidx()) && "desc".equals(entity.getSord())){
+            wrapper = wrapper.orderByDesc(entity.getSidx());
+        }else if(StringUtils.isNotEmpty(entity.getSidx())){
+            wrapper = wrapper.orderByAsc(entity.getSidx());
+        }
+        IPage<T> ipage = page(page, wrapper);
+        return Result.ok(pageSize > max_size ? msg : null)
+                .page(ipage.getTotal(),getDtoList(ipage.getRecords()))
+                ;
+    }
+    /**
+     * 查询列表(使用token中用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public List<R> getAllList(T entity,  boolean checkUser){
+        List<T> tList = baseMapper.selectList(checkWrapper(entity,checkUser));
+        if(null != tList){
+            return getDtoList(tList);
+        }else{
+            return null ;
+        }
+    }
+    /**
+     * 查询列表(使用token中用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result getListByToken(T entity){
+        List<R> rList = getAllList(entity,true);
+        if(null != rList){
+            return Result.ok(rList);
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 查询列表(不使用token用户信息)
+     * @param entity
+     * @return
+     */
+    @Transactional
+    public Result getListNoToken(T entity){
+        List<R> rList = getAllList(entity,false);
+        if(null != rList){
+            return Result.ok(rList);
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+
+    /**
+     *
+     * @return
+     */
+    private List<R> getDtoList(Object obj){
+        if(null != obj){
+            return JSONArray.parseArray(JSONArray.toJSONString(obj), getDtoClass());
+        }else{
+            return null ;
+        }
+    }
+
+    /**
+     *
+     * @return
+     */
+    private R getDto(Object obj){
+        if(null != obj){
+            return JSONObject.parseObject(JSONObject.toJSONString(obj), getDtoClass());
+        }else{
+            return null ;
+        }
+    }
+    /**
+     * 详情
+     * @param id
+     * @return
+     */
+    @Transactional
+    public Result detail(Integer id){
+        T t =  baseMapper.selectById(id);
+        if(null != t){
+            return Result.success(t);
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+
+    /**
+     * 查询信息
+     * @param id
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> info(Integer id){
+        T t = baseMapper.selectById(id);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result getOne(T entity){
+        T t = getOne(checkWrapper(entity,false), false);
+        if(null != t){
+            return Result.ok(t);
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> getOneDto(T entity){
+        T t = getOne(checkWrapper(entity,false), false);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> getOneDto(T entity,boolean checkUser){
+        T t = getOne(checkWrapper(entity,checkUser), false);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> getOneDtoCheckNull(T entity,boolean checkUser ,String... isNullColumn){
+        //拼接查询条件
+        QueryWrapper<T> wrapper = checkWrapper(entity,checkUser);
+        if(null != isNullColumn){
+            QueryWrapper<T> finalWrapper = wrapper;
+            Arrays.asList(isNullColumn).forEach(str->{
+                finalWrapper.isNull(str);
+            });
+        }
+        T t = getOne(wrapper, false);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> getOneDtoCheckNotNull(T entity,boolean checkUser ,String... isNotNullColumn){
+        //拼接查询条件
+        QueryWrapper<T> wrapper = checkWrapper(entity,checkUser);
+        if(null != isNotNullColumn){
+            QueryWrapper<T> finalWrapper = wrapper;
+            Arrays.asList(isNotNullColumn).forEach(str->{
+                finalWrapper.isNotNull(str);
+            });
+        }
+        T t = getOne(wrapper, false);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    /**
+     * 根据条件获取一条数据
+     * @param entity
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<R> getOneDto(T entity,boolean checkUser,String orderByClum,boolean isAse){
+        QueryWrapper<T> tQueryWrapper = checkWrapper(entity, checkUser);
+        if(StringUtils.isNotEmpty(orderByClum) ){
+            tQueryWrapper.orderBy(false,isAse,orderByClum);
+        }
+        T t = getOne(tQueryWrapper, false);
+        if(null != t){
+            return Result.ok()
+                    .putDataJSON(getDto(t))
+                    ;
+        }else{
+            return Result.error("未查到数据!");
+        }
+    }
+    protected Class<R> getDtoClass(){
+        return (Class<R>) GenericlassUtil.getActualTypeArgument(this.getClass(), 2);
+    }
+
+    /**
+     * 拼接查询条件方法
+     * @param entity
+     * @return
+     */
+    public QueryWrapper<T> checkWrapper(T entity,boolean checkUser){
+        QueryWrapper<T> wrapper = new QueryWrapper<T>();
+        try {
+            if(null != entity) {
+                Field[] declaredFields = entity.getClass().getDeclaredFields();
+                for (Field field : declaredFields) {
+                    field.setAccessible(true);
+                    String name = field.getName();
+                    //判断非使用属性
+                    TableField tableField = field.getAnnotation(TableField.class);
+                    if(null != tableField && !tableField.exist()){
+                        continue;
+                    }
+                    String column = (null == tableField ?  ObjectUtil.toUnderScoreCase(name) :tableField.value());
+                    Object value = field.get(entity);
+                    if (null != value && entity.notIn(name) && !"userId".equals(name) && !"accountId".equals(name)
+                    ) {
+                        if ("java.lang.String".contains(field.getType().getName()) && StringUtils.isNotEmpty((String) value) ) {
+                            wrapper = wrapper.like(column, value);
+                        }else
+                        if ("java.lang.Integer".contains(field.getType().getName()) || "java.lang.Long".contains(field.getType().getName()) ) {
+                            wrapper = wrapper.eq(column, value);
+                        }
+                    }
+                    //添加普通用户id 的判断
+                    if("userId".equals(name) || "accountId".equals(name)){
+                        UserInfo userInfo = checkUser ?  ServletUtils.getUserInfo() : null ;
+                        if(null != userInfo ){
+                            wrapper = wrapper.eq("user_id" , (null == userInfo.getId() ? Integer.parseInt(userInfo.getSub()) : userInfo.getId()));
+                        }else if (null != value && entity.notIn(name)){
+                            if("accountId".equals(name)){
+                                wrapper = wrapper.eq("user_id" , value);
+                            }else {
+                                wrapper = wrapper.eq(column, value);
+                            }
+                        }else if( null == userInfo && null != value){
+                            wrapper = wrapper.eq("user_id" , value);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("checkWrapper Error " + e);
+            e.printStackTrace();
+            throw new ServiceException("查询失败【"+e.getMessage()+"】!");
+        }
+        return wrapper;
+    }
+    /**
+     * 拼接查询条件方法
+     *
+     * @param entity
+     * @return
+     */
+    public MPJLambdaWrapper<T> checkMpjWrapper(T entity, boolean checkUser) {
+        MPJLambdaWrapper<T> wrapper = new MPJLambdaWrapper<T>();
+        try {
+            if (null != entity) {
+                Field[] declaredFields = entity.getClass().getDeclaredFields();
+                for (Field field : declaredFields) {
+                    field.setAccessible(true);
+                    String name = field.getName();
+                    //判断非使用属性
+                    TableField tableField = field.getAnnotation(TableField.class);
+                    if (null != tableField && !tableField.exist()) {
+                        continue;
+                    }
+                    String column = (null == tableField ? ObjectUtil.toUnderScoreCase(name) : tableField.value());
+                    Object value = field.get(entity);
+                    if (!Objects.isNull(value) && entity.notIn(name) && !"userId".equals(name) && !"accountId".equals(name)
+                    ) {
+                        if ("java.lang.String".contains(field.getType().getName()) && StringUtils.isNotBlank((String) value)) {
+                            wrapper = wrapper.like(column, value);
+                        } else if ("java.lang.Integer".contains(field.getType().getName()) || "java.lang.Long".contains(field.getType().getName())) {
+                            wrapper = wrapper.eq(column, value);
+                        }
+                    }else{
+                        //判断用户数据权限
+                        UserInfo userInfo = checkUser ? ServletUtils.getUserInfo() : null;
+                        if(null != userInfo && checkUser){
+                            switch (userInfo.getDataAuth()){
+                                case DEPT: //部门[商家]级
+                                    if ("merchantId".equals(name) || "merId".equals(name) ) {
+                                        wrapper = wrapper.eq(column, userInfo.getMerchantId());
+                                    }
+                                    break;
+                                case PERSON: //个人
+                                    if ("userId".equals(name) || "accountId".equals(name) || "createBy".equals(name)) {
+                                        wrapper = wrapper.eq(column, userInfo.getId());
+                                    }
+                                    break;
+                                default:
+                                    if(null != value){
+                                        wrapper = wrapper.eq(column, value);
+                                    }
+                            }
+                        }else{
+                            if(null != value){
+                                wrapper = wrapper.eq(column, value);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("checkWrapper Error " + e);
+            e.printStackTrace();
+            throw new ServiceException("查询失败【" + e.getMessage() + "】!");
+        }
+        return wrapper;
+    }
+
+
+    public String getWhere(MPJLambdaWrapper wrapper) {
+        final String[] sqlSelect = {wrapper.getSqlSegment()
+                                           .replaceAll("#\\{", "").replaceAll("}", "")};
+        wrapper.getParamNameValuePairs()
+               .forEach((k, v) -> {
+                   String key = "ew.paramNameValuePairs." + k;
+                   if (v.getClass()
+                        .equals(Date.class)) {
+                       sqlSelect[0] =
+                               sqlSelect[0].replaceAll(key, "'" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, (Date) v) + "'");
+                   } else if (v.getClass()
+                               .equals(String.class)) {
+                       sqlSelect[0] = sqlSelect[0].replaceAll(key, "'" + v + "'");
+                   } else {
+                       sqlSelect[0] = sqlSelect[0].replaceAll(key, String.valueOf(v));
+                   }
+               });
+        return sqlSelect[0];
+    }
+
+}

+ 95 - 0
poyee-base/src/main/java/com/poyee/common/constant/Constants.java

@@ -0,0 +1,95 @@
+package com.poyee.common.constant;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+
+public class Constants {
+    /**
+     * UTF-8 字符集
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * 通用成功标识
+     */
+    public static final String SUCCESS = "0";
+
+    /**
+     * 通用失败标识
+     */
+    public static final String FAIL = "1";
+
+    /**
+     * 登录成功
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    public static final String CODE_TYPE_INCR="CODE_TYPE_INCR_";
+    public static final String TRADE_SUCCESS_EN="SUCCESS";
+    public static final String TRADE_REFUND="TRADE_REFUND";
+    public static final String ALIPAY_TRADE_SUCCESS="TRADE_SUCCESS";
+    public static final String ALIPAY_REFUND_SUCCESS="REFUND_SUCCESS";
+
+    public static final BigDecimal big_zero = new BigDecimal(0);
+    public static final BigDecimal big_one_hundred = new BigDecimal(100);
+    // 待支付, 支付失败
+    public static final List<Integer> cancel_status = Arrays.asList(100,203);
+    // 待支付,订单超时, 支付失败,退款完成
+    public static final List<Integer> refund_status = Arrays.asList(100,201,202,203,205);
+    // 已发货等
+    public static final List<Integer> sendExpress_status = Arrays.asList(104,105,106,301);
+    //退款:快递
+    public static final String refund_freight = "freight";
+    //退款:订单费用
+    public static final String refund_order = "order";
+    //退款:全部费用
+    public static final String frefund_all = "all";
+    //checklist 基础信息
+    public static final List<String> checklist_base = Arrays.asList("year","sport","manufacturer","sets","sets_version");
+    //checklist 卡片信息
+    public static final List<String> checklist_info = Arrays.asList("team","player","card_set");
+    //钱包订单类型
+    public static final List<String> rechargeOrderType = Arrays.asList("recharge","withdraw");
+    //分账支付类型
+    public static final List<String> ledgerPayType = Arrays.asList("baofoo","adapay");
+
+    public static final String SF_TOKEN = "sf_token";
+    public static final String CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";
+    public static final String CONTENT_TYPE_JSON = "application/json";
+    //用户实名等敏感信息加密密钥
+    public static final String AES_USER_PASSWORD="E1C7AE96EFE6CD2CD84861C029C2E80D";
+    //一万
+    public static final BigDecimal BIG_TEN_THOUSAND = new BigDecimal("10000");
+    //十万
+    public static final BigDecimal BIG_ONE_HUNDRED = new BigDecimal("100000");
+
+    public static final String ADAPAY = "adapay";
+    public static final String ADAPAY_BANK_NO = "adapay_bank_no";
+    public static final String ADAPAY_ADDRESS_NO = "adapay_address_no";
+
+    public static final String ORDER_CALLBACK_LOCK_KEY="order_callback_lock_key";
+    public static final String EXPRESS_CALLBACK_LOCK_KEY="express_callback_lock_key_";
+
+    public static final String DELAYED_TASKS_KEY = "delayed_tasks_key:";
+    //新支付类型
+    public static String PAY_TYPE_KEY = "pay_type:new";
+    //支付类型未使用
+    public static String PAY_TYPE_UN_USE_KEY = "pay_type_un_use_key:";
+    //支付类型锁
+    public static String PAY_TYPE_LOCK_KEY = "pay_type_lock_key:";
+    //订单可用数量
+    public static String PAY_TYPE_ORDER_COUNT_KEY = "pay_type_order_count_key:";
+    //订单总金额
+    public static String PAY_TYPE_ORDER_TOTAL_AMOUNT_KEY = "pay_type_order_total_amount_key:";
+    //订单分配新通道支付类型
+    public static String PAY_TYPE_ORDER_KEY = "order_pay_type:new";
+    //锁时间
+    public static Integer DEFAULT_LOCK_TIME = 3*60;
+
+}

+ 25 - 0
poyee-base/src/main/java/com/poyee/common/constant/SystemConstant.java

@@ -0,0 +1,25 @@
+package com.poyee.common.constant;
+
+public class SystemConstant {
+
+    public static int JWT_ERRCODE_EXPIRE = 401;
+
+    public static int JWT_ERRCODE_FAIL = 400;
+
+    public static String JWT_SECERT = "4570b0";
+
+    public static String AES_KEY = "4570b0";
+    //30分钟过期时间
+    public static long millis = 30*60*1000;
+    //退款手机验证权限码
+    public static String auth_phone_code_refund = "phone_code_refund";
+    //手机验证码-商家禁用 权限码
+    public static String auth_phone_code_merchant_1 = "phone_code_merchant_1";
+    //白名单
+    public static String auth_white = "white";
+    //黑名单
+    public static String auth_black = "black";
+    //超级权限
+    public static String auth_super = "super";
+
+}

+ 77 - 0
poyee-base/src/main/java/com/poyee/common/dto/Result.java

@@ -0,0 +1,77 @@
+package com.poyee.common.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * result
+ */
+@Data
+@ToString
+@NoArgsConstructor
+public class Result implements Serializable {
+
+    private Integer code = 0;
+
+    private String msg = "SUCCESS";
+
+    private boolean success = true;
+
+    private Map<String ,Object> data = new HashMap<>();
+
+    public static Result ok(){
+        return new Result();
+    }
+
+    public static Result ok(String msg){
+        Result result = new Result();
+        result.setMsg(msg);
+        return result;
+    }
+
+    public static Result ok(Integer code,String msg){
+        Result result = new Result();
+        result.setCode(code);
+        result.setMsg(msg);
+        return result;
+    }
+
+    public static Result error(Integer code,String msg){
+        Result result = new Result();
+        result.setCode(code);
+        result.setMsg(msg);
+        result.setSuccess(false);
+        return result;
+    }
+
+    public Result put(String key, Object value){
+        if(null == this.data) this.data = new HashMap<>();
+        this.data.put(key,value);
+        return this;
+    }
+
+    public Result putAll(Object obj){
+        if(null == this.data) this.data = new HashMap<>();
+        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));
+        this.data.putAll(jsonObject);
+        return this;
+    }
+
+    public String getString(String key){
+        if(null == this.data) return null;
+        return (String) this.data.get(key);
+    }
+
+    public Object get(String key){
+        if(null == this.data) return null;
+        return this.data.get(key);
+    }
+
+
+}

+ 19 - 0
poyee-base/src/main/java/com/poyee/common/enums/BusinessStatus.java

@@ -0,0 +1,19 @@
+package com.poyee.common.enums;
+
+/**
+ * 操作状态
+ * 
+ * @author zheng
+ */
+public enum BusinessStatus
+{
+    /**
+     * 成功
+     */
+    SUCCESS,
+
+    /**
+     * 失败
+     */
+    FAIL,
+}

+ 69 - 0
poyee-base/src/main/java/com/poyee/common/enums/BusinessType.java

@@ -0,0 +1,69 @@
+package com.poyee.common.enums;
+
+/**
+ * 业务操作类型
+ * 
+ * @author zheng
+ */
+public enum BusinessType
+{
+    /**
+     * 其它
+     */
+    OTHER,
+
+    /**
+     * 新增
+     */
+    INSERT,
+
+    /**
+     * 修改
+     */
+    UPDATE,
+
+    /**
+     * 删除
+     */
+    DELETE,
+
+    /**
+     * 授权
+     */
+    GRANT,
+
+    /**
+     * 导出
+     */
+    EXPORT,
+
+    /**
+     * 导入
+     */
+    IMPORT,
+
+    /**
+     * 强退
+     */
+    FORCE,
+
+    /**
+     * 生成代码
+     */
+    GENCODE,
+    
+    /**
+     * 清空
+     */
+    CLEAN,
+    /**
+     * 查询
+     */
+    SEARCH,
+    /**
+     * 调用接口
+     */
+    INTERFACE,
+
+
+}

+ 27 - 0
poyee-base/src/main/java/com/poyee/common/enums/DataAuth.java

@@ -0,0 +1,27 @@
+package com.poyee.common.enums;
+
+/**
+ * 数据权限
+ */
+public enum DataAuth {
+    /**
+     * 所有
+     */
+    ALL,
+
+    /**
+     * 个人
+     */
+    PERSON,
+
+    /**
+     * 部门
+     */
+    DEPT
+
+    ;
+
+
+
+
+}

+ 12 - 0
poyee-base/src/main/java/com/poyee/common/enums/DesensitType.java

@@ -0,0 +1,12 @@
+package com.poyee.common.enums;
+
+//脱敏类型
+public enum DesensitType {
+    //默认
+    DEFAULT,
+    //置空
+    NULL,
+    //MD5
+    MD5
+
+}

+ 29 - 0
poyee-base/src/main/java/com/poyee/common/enums/OperatorType.java

@@ -0,0 +1,29 @@
+package com.poyee.common.enums;
+
+/**
+ * 操作人类别
+ * 
+ * @author zheng
+ */
+public enum OperatorType
+{
+    /**
+     * 其它
+     */
+    OTHER,
+
+    /**
+     * 后台用户
+     */
+    MANAGE,
+
+    /**
+     * 手机端用户
+     */
+    MOBILE,
+
+    /**
+     * 第三方用户
+     */
+    THIRD
+}

+ 102 - 0
poyee-base/src/main/java/com/poyee/common/exception/BaseException.java

@@ -0,0 +1,102 @@
+package com.poyee.common.exception;
+
+import com.poyee.common.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 基础异常
+ * 
+ * @author zheng
+ */
+public class BaseException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 所属模块
+     */
+    private String module;
+
+    /**
+     * 错误码
+     */
+    private String code;
+
+    /**
+     * 错误码对应的参数
+     */
+    private Object[] args;
+
+    /**
+     * 错误消息
+     */
+    private String defaultMessage;
+
+    public BaseException(String module, String code, Object[] args, String defaultMessage)
+    {
+        this.module = module;
+        this.code = code;
+        this.args = args;
+        this.defaultMessage = defaultMessage;
+    }
+
+    public BaseException(Integer code,  String defaultMessage)
+    {
+        this(null, code+"", null, defaultMessage);
+    }
+
+    public BaseException(String module, String code, Object[] args)
+    {
+        this(module, code, args, null);
+    }
+
+    public BaseException(String module, String defaultMessage)
+    {
+        this(module, null, null, defaultMessage);
+    }
+
+    public BaseException(String code, Object[] args)
+    {
+        this(null, code, args, null);
+    }
+
+    public BaseException(String defaultMessage)
+    {
+        this(null, null, null, defaultMessage);
+    }
+
+    @Override
+    public String getMessage()
+    {
+        String message = null;
+        if (!StringUtils.isEmpty(code))
+        {
+            message = MessageUtils.message(code, args);
+        }
+        if (message == null)
+        {
+            message = defaultMessage;
+        }
+        return message;
+    }
+
+    public String getModule()
+    {
+        return module;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public Object[] getArgs()
+    {
+        return args;
+    }
+
+    public String getDefaultMessage()
+    {
+        return defaultMessage;
+    }
+}

+ 41 - 0
poyee-base/src/main/java/com/poyee/common/exception/BusinessException.java

@@ -0,0 +1,41 @@
+package com.poyee.common.exception;
+
+/**
+ * 业务异常
+ * 
+ * @author zheng
+ */
+public class BusinessException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+
+    protected Integer code = -1 ;
+
+    public BusinessException(Integer code,String message)
+    {
+        this.code = code;
+        this.message = message;
+    }
+    public BusinessException(String message)
+    {
+        this.message = message;
+    }
+
+    public BusinessException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public Integer getCode(){
+        return code;
+    }
+}

+ 132 - 0
poyee-base/src/main/java/com/poyee/common/exception/GlobalExceptionHandler.java

@@ -0,0 +1,132 @@
+package com.poyee.common.exception;
+
+import com.poyee.base.dto.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.BindException;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ *
+ */
+@ControllerAdvice
+@ResponseBody
+public class GlobalExceptionHandler extends RuntimeException {
+    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+    /**
+     * 权限校验失败 如果请求为ajax返回json,普通请求跳转页面
+     */
+    /*@ExceptionHandler(AuthorizationException.class)
+    public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e)
+    {
+        log.error(e.getMessage(), e);
+        if (ServletUtils.isAjaxRequest(request))
+        {
+            return AjaxResult.error(PermissionUtils.getMsg(e.getMessage()));
+        }
+        else
+        {
+            ModelAndView modelAndView = new ModelAndView();
+            modelAndView.setViewName("error/unauth");
+            return modelAndView;
+        }
+    }*/
+
+    /**
+     * 请求方式不支持
+     */
+    @ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
+    public Result handleException(HttpRequestMethodNotSupportedException e)
+    {
+        log.error("运行异常:{}", e);
+        return Result.error("不支持' " + e.getMethod() + "'请求");
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    public Object notFount(RuntimeException e)
+    {
+        log.error("运行时异常:{}", e);
+        if(e.getCause() instanceof SQLException){
+            return Result.error("sql运行异常,请联系管理员");
+        }
+        return Result.error("运行出错了:" + e.getMessage());
+    }
+
+    @ExceptionHandler(ServiceException.class)
+    public Result serviceErr(ServiceException e) {
+        log.error("运行时异常:{}", e);
+        if(e.getCode() == 0){
+            e.code = -1;
+        }
+        return Result.error(e.getCode(),e.getMessage());
+    }
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class)
+    public Result handleException(Exception e)
+    {
+        log.error("运行异常:{}", e);
+        return Result.error("服务器错误,请联系管理员");
+    }
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(BaseException.class)
+    public Object baseException(BaseException e)
+    {
+        log.error(e.getMessage(), e);
+        String errMsg = e.getMessage();
+        return Result.error(errMsg);
+    }
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(BusinessException.class)
+    public Object businessException( BusinessException e)
+    {
+        log.error(e.getMessage(), e);
+        String errMsg = e.getMessage();
+        Integer code = e.getCode();
+        return Result.error(code,errMsg);
+    }
+
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(BindException.class)
+    public Result validatedBindException(BindException e)
+    {
+        log.error(e.getMessage(), e);
+        String message = e.getAllErrors().get(0).getDefaultMessage();
+        return Result.error(message);
+    }
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+        StringBuilder msg = new StringBuilder();
+        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
+        for (ObjectError allError : allErrors) {
+            msg.append(allError.getDefaultMessage()).append(",");
+        }
+        if (null != msg && msg.length()>1) {
+            return Result.error(msg.substring(0,msg.length()-1));
+        }
+        return Result.error(msg.toString());
+    }
+}

+ 42 - 0
poyee-base/src/main/java/com/poyee/common/exception/ServiceException.java

@@ -0,0 +1,42 @@
+package com.poyee.common.exception;
+
+/**
+ * 业务异常
+ * 
+ * @author zheng
+ */
+public class ServiceException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+    protected int code=0;
+
+    public ServiceException(String message)
+    {
+        this.message = message;
+    }
+
+    public ServiceException(int code, String message) {
+        this.message = message;
+        this.code = code;
+    }
+
+    public ServiceException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public int getCode()
+    {
+        return this.code;
+    }
+
+}

+ 25 - 0
poyee-base/src/main/java/com/poyee/common/swagger/ArrayRefProperty.java

@@ -0,0 +1,25 @@
+package com.poyee.common.swagger;
+
+
+import io.swagger.models.properties.ArrayProperty;
+import io.swagger.models.properties.RefProperty;
+import io.swagger.models.refs.GenericRef;
+import io.swagger.models.refs.RefType;
+/**
+ * 同时拥有ArrayProperty和RefProperty的特性
+ * @author ChenZhiPing 2018年10月30日 下午6:08:57
+ */
+public class ArrayRefProperty extends ArrayProperty {
+    private GenericRef genericRef;
+    public String get$ref() {
+        return genericRef.getRef();
+    }
+    public void set$ref(String ref) {
+        this.genericRef = new GenericRef(RefType.DEFINITION, ref);
+// $ref
+        RefProperty items = new RefProperty();
+        items.setType(ref);
+        items.set$ref(ref);
+        this.items(items);
+    }
+}

+ 202 - 0
poyee-base/src/main/java/com/poyee/common/swagger/SwaggerUiController.java

@@ -0,0 +1,202 @@
+package com.poyee.common.swagger;
+
+import com.github.xiaoymin.swaggerbootstrapui.model.SwaggerBootstrapUiPathInstance;
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiSort;
+import io.swagger.models.*;
+import io.swagger.models.properties.Property;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+import org.springframework.web.util.UriComponents;
+import springfox.documentation.annotations.ApiIgnore;
+import springfox.documentation.service.Documentation;
+import springfox.documentation.service.Tag;
+import springfox.documentation.spring.web.DocumentationCache;
+import springfox.documentation.spring.web.PropertySourcedMapping;
+import springfox.documentation.spring.web.json.Json;
+import springfox.documentation.spring.web.json.JsonSerializer;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.*;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE;
+import static springfox.documentation.swagger.common.HostNameProvider.componentsFrom;
+
+@Controller
+@ApiIgnore
+public class SwaggerUiController {
+    /***
+     * sort排序接口
+     */
+    public static final String DEFAULT_SORT_URL = "/v2/api-docs-default";
+    private static final String HAL_MEDIA_TYPE = "application/hal+json";
+    private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerUiController.class);
+    private final ServiceModelToSwagger2Mapper mapper;
+    private final DocumentationCache documentationCache;
+    private final JsonSerializer jsonSerializer;
+    private final String hostNameOverride;
+    @Autowired
+    public SwaggerUiController(Environment environment, ServiceModelToSwagger2Mapper mapper,
+                               DocumentationCache documentationCache, JsonSerializer jsonSerializer) {
+        this.mapper = mapper;
+        this.documentationCache = documentationCache;
+        this.jsonSerializer = jsonSerializer;
+        this.hostNameOverride = environment.getProperty("springfox.documentation.swagger.v2.host", "DEFAULT");
+        ;
+    }
+    @RequestMapping(value = DEFAULT_SORT_URL, method = RequestMethod.GET, produces = { APPLICATION_JSON_VALUE,
+            HAL_MEDIA_TYPE })
+    @PropertySourcedMapping(
+            value = "${springfox.documentation.swagger.v2.path}",
+            propertyKey = "springfox.documentation.swagger.v2.path")
+    @ResponseBody
+    public ResponseEntity<Json> apiSorts(@RequestParam(value = "group", required = false) String swaggerGroup,
+                                         HttpServletRequest request) {
+        String groupName = Optional.fromNullable(swaggerGroup).or(Docket.DEFAULT_GROUP_NAME);
+        Documentation documentation = documentationCache.documentationByGroup(groupName);
+        if (documentation == null) {
+            LOGGER.warn("Unable to find specification for grouRp {}", groupName);
+            return new ResponseEntity<Json>(HttpStatus.NOT_FOUND);
+        }
+        Swagger swagger = mapper.mapDocumentation(documentation);
+        UriComponents uriComponents = componentsFrom(request, swagger.getBasePath());
+        swagger.basePath(Strings.isNullOrEmpty(uriComponents.getPath()) ? "/" : uriComponents.getPath());
+        if (isNullOrEmpty(swagger.getHost())) {
+            swagger.host(hostName(uriComponents));
+        }
+// 扩展
+        swagger = extend(swagger);
+        SwaggerExt swaggerExt = new SwaggerExt(swagger);
+// swaggerBootstrapUi.setTagSortLists(getSortTag(request,documentation));
+        swaggerExt.setSwaggerBootstrapUi(initSwaggerBootstrapUi(request, documentation));
+// Method 层排序
+        return new ResponseEntity<Json>(jsonSerializer.toJson(swaggerExt), HttpStatus.OK);
+    }
+    @SuppressWarnings("deprecation")
+    private SwaggerBootstrapUi initSwaggerBootstrapUi(HttpServletRequest request, Documentation documentation) {
+        SwaggerBootstrapUi swaggerBootstrapUi = new SwaggerBootstrapUi();
+        WebApplicationContext wc = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
+        Iterator<Tag> tags = documentation.getTags().iterator();
+        List<SwaggerBootstrapUiTag> targetTagLists = Lists.newArrayList();
+// Ctl层排序
+        Map<String, Object> beansWithAnnotation = wc.getBeansWithAnnotation(Controller.class);
+// path排序
+        List<SwaggerBootstrapUiPath> targetPathLists = Lists.newArrayList();
+        while (tags.hasNext()) {
+            Tag sourceTag = tags.next();
+            String tagName = sourceTag.getName();
+            boolean exists = false;
+            Class<?> aClass = null;
+            Api api = null;
+            for (Map.Entry<String, Object> entry : beansWithAnnotation.entrySet()) {
+                aClass = entry.getValue().getClass();
+                api = aClass.getAnnotation(Api.class);
+                if (api != null) {
+// 是否相等
+                    if (Lists.newArrayList(api.tags()).contains(tagName)) {
+                        exists = true;
+                        break;
+                    }
+                }
+            }
+// 获取order值
+            int order = Integer.MAX_VALUE;
+            SwaggerBootstrapUiTag tag = new SwaggerBootstrapUiTag(order);
+            tag.name(sourceTag.getName()).description(sourceTag.getDescription());
+            if (exists) {
+// 优先获取api注解的position属性,如果不等于0,则取此值,否则获取apiSort注解,判断是否为空,如果不为空,则获取apisort的值,优先级:@Api-position>@ApiSort-value
+                int post = api.position();
+                if (post == 0) {
+                    ApiSort annotation = aClass.getAnnotation(ApiSort.class);
+                    if (annotation != null) {
+                        order = annotation.value();
+                    }
+                } else {
+                    order = post;
+                }
+// targetTagLists.add(new
+// Tag(sourceTag.getName(),sourceTag.getDescription(),order,sourceTag.getVendorExtensions()));
+                tag.setOrder(order);
+// 获取父级path
+                String parentPath = "";
+                RequestMapping parent = aClass.getAnnotation(RequestMapping.class);
+                if (parent != null) {
+                    parentPath = parent.value()[0];
+                }
+                Method[] methods = aClass.getDeclaredMethods();
+                for (Method method : methods) {
+                    List<SwaggerBootstrapUiPath> paths = new SwaggerBootstrapUiPathInstance(parentPath, method).match();
+                    if (paths != null && paths.size() > 0) {
+                        targetPathLists.addAll(paths);
+                    }
+                }
+            }
+            targetTagLists.add(tag);
+        }
+        Collections.sort(targetTagLists, new Comparator<SwaggerBootstrapUiTag>() {
+            @Override
+            public int compare(SwaggerBootstrapUiTag o1, SwaggerBootstrapUiTag o2) {
+                return o1.getOrder().compareTo(o2.getOrder());
+            }
+        });
+        Collections.sort(targetPathLists, new Comparator<SwaggerBootstrapUiPath>() {
+            @Override
+            public int compare(SwaggerBootstrapUiPath o1, SwaggerBootstrapUiPath o2) {
+                return o1.getOrder().compareTo(o2.getOrder());
+            }
+        });
+        swaggerBootstrapUi.setTagSortLists(targetTagLists);
+        swaggerBootstrapUi.setPathSortLists(targetPathLists);
+        return swaggerBootstrapUi;
+    }
+    private String hostName(UriComponents uriComponents) {
+        if ("DEFAULT".equals(hostNameOverride)) {
+            String host = uriComponents.getHost();
+            int port = uriComponents.getPort();
+            if (port > -1) {
+                return String.format("%s:%d", host, port);
+            }
+            return host;
+        }
+        return hostNameOverride;
+    }
+    private Swagger extend(Swagger swagger) {
+// 响应返回参数增强
+        Map<String, Model> definitions = swagger.getDefinitions();
+        Iterator<Map.Entry<String, Model>> it = swagger.getDefinitions().entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Model> entry = it.next();
+            Model model = entry.getValue();
+            String key = entry.getKey();
+            if (key.contains("Result") && !key.equals("Result")) {
+                Map<String, Property> props = model.getProperties();
+                if(props == null ){
+                    model.setProperties(definitions.get("Result").getProperties());
+                    props = model.getProperties();
+                    Property dataProp = props.get("data");
+                    Property newProp = SwaggerUtil.getNewProp(dataProp, SwaggerUtil.getRealType(key), swagger.getDefinitions());
+                    props.put("data", newProp);
+                }
+            }
+        }
+        return swagger;
+    }
+}

+ 213 - 0
poyee-base/src/main/java/com/poyee/common/swagger/SwaggerUtil.java

@@ -0,0 +1,213 @@
+package com.poyee.common.swagger;
+
+import io.swagger.models.Model;
+import io.swagger.models.properties.*;
+import io.swagger.models.properties.PropertyBuilder.PropertyId;
+import org.springframework.beans.BeanUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+/**
+ * @author ChenZhiPing 2018年10月31日 下午1:44:50
+ */
+public class SwaggerUtil {
+    /**
+     * 判断是否Swagger基本类型
+     * @param type
+     * @return
+     */
+    public static boolean isBaseType(String type) {
+        return SwaggerUtil.getSwaggerProperty(type) != null;
+    }
+    /**
+     * 获取Swagger支持的类型
+     * @return
+     */
+    public static Map<String, AbstractProperty> getPropMap() {
+        Map<String, AbstractProperty> map = new HashMap<String, AbstractProperty>();
+        map.put("integer", new IntegerProperty());
+        map.put("int", new IntegerProperty());
+        map.put("long", new LongProperty());
+        map.put("string", new StringProperty());
+        map.put("object", new ObjectProperty());
+        map.put("array", new ArrayProperty());
+        map.put("boolean", new BooleanProperty());
+        map.put("date", new DateTimeProperty());
+        return map;
+    }
+    /**
+     * 通过java类型获取Swagger类型
+     * @param type javaType
+     * @return swaggerType
+     */
+    public static AbstractProperty getSwaggerProperty(String type) {
+        type = type.toLowerCase();
+        return SwaggerUtil.getPropMap().get(type);
+    }
+    public static boolean isMap(String type) {
+        type = type.toLowerCase();
+        return type.startsWith("map");
+    }
+    public static boolean isIterable(String type) {
+        type = type.toLowerCase();
+        return type.startsWith("list") || type.startsWith("set");
+    }
+    /**
+     * 获取非基本类型的T<br>
+     * new String[] { "A<List<C1>>", "A<C2>", "A<B<String,<String,List<C4>>>>" }
+     * @param type
+     * @return C1,C2,C3,C4
+     */
+    public static String getRef(String type) {
+        try {
+            String m = type.substring(type.lastIndexOf("«") + 1, type.indexOf("»"));
+            String[] cc = m.split(",");
+            for (String c : cc) {
+                if (!SwaggerUtil.isBaseType(c)) {
+                    return c;
+                }
+            }
+            return type;
+        } catch (Exception e) {
+        }
+        return "!!Unknown T!!";
+    }
+    /**
+     * 获取对象类型,主要是剥离第一层<>
+     * @param type JsonResult<Map<Operator, List<Map<String, Customer>>>>
+     * @return Map<Operator, List<Map<String, Customer>>>
+     */
+    public static String getRealType(String type) {
+        try {
+            String m = type.substring(type.indexOf("«") + 1, type.lastIndexOf("»"));
+            return m;
+        } catch (Exception e) {
+        }
+        return type;
+    }
+    /**
+     * 判断是否存在非基本类型<参照类型>
+     * @param type
+     * @return
+     */
+    public static boolean hasRef(String type) {
+        if (type.indexOf("»") > 0) {
+            try {
+                String m = type.substring(type.lastIndexOf("«") + 1, type.indexOf("»"));
+                String[] cc = m.split(",");
+                for (String c : cc) {
+                    if (!SwaggerUtil.isBaseType(c)) {
+                        return true;
+                    }
+                }
+                return false;
+            } catch (Exception e) {
+                return false;
+            }
+        } else {
+            return !SwaggerUtil.isBaseType(type);
+        }
+    }
+    /**
+     * 递归处理泛型类型 <br>
+     * JsonResult<Map<Map<Long, Operator>, List<Map<String, Customer>>>>
+     * @param dataProp
+     * @param type
+     * @param definitions
+     * @return
+     */
+    public static Property getNewProp(Property dataProp, String type, Map<String, Model> definitions) {
+        Property newProp = null;
+        Model model = definitions.get(type);
+        Map<String, Property> props = null;
+        if (null != model) {
+            props = model.getProperties();
+        }
+        if (null == props) {
+            props = new HashMap<String, Property>();
+        }
+        String realType = SwaggerUtil.getRealType(type);
+        if (SwaggerUtil.isMap(type)) {
+            String[] realTypes = SwaggerUtil.splitByComma(realType);
+            Map<PropertyId, Object> argsK = new HashMap<PropertyId, Object>();
+            argsK.put(PropertyBuilder.PropertyId.DESCRIPTION, "Map的键");
+            argsK.put(PropertyBuilder.PropertyId.TYPE, realTypes[0].toLowerCase());
+            AbstractProperty _prop0 = SwaggerUtil.getSwaggerProperty(realTypes[0]);
+            Property propK = PropertyBuilder.build(null == _prop0 ? "object" : _prop0.getType(),
+                    null == _prop0 ? null : _prop0.getFormat(), argsK);
+            propK.setName("key");
+            Map<PropertyId, Object> argsV = new HashMap<PropertyId, Object>();
+            argsV.put(PropertyBuilder.PropertyId.DESCRIPTION, "Map的值");
+            argsV.put(PropertyBuilder.PropertyId.TYPE, realTypes[1].toLowerCase());
+            AbstractProperty _prop1 = SwaggerUtil.getSwaggerProperty(realTypes[1]);
+            Property propV = PropertyBuilder.build(null == _prop1 ? "object" : _prop1.getType(),
+                    null == _prop1 ? null : _prop1.getFormat(), argsV);
+            propV.setName("value");
+            if (!realType.equals(type)) {
+                propK = SwaggerUtil.getNewProp(propK, realTypes[0], definitions);
+                propV = SwaggerUtil.getNewProp(propV, realTypes[1], definitions);
+            }
+            props.put(propK.getName(), propK);
+            props.put(propV.getName(), propV);
+            newProp = new RefProperty();
+            BeanUtils.copyProperties(dataProp, newProp);
+            ((RefProperty) newProp).set$ref(type);
+        } else if (SwaggerUtil.isIterable(type)) {
+            String ref = SwaggerUtil.getRealType(type);
+            newProp = new ArrayRefProperty();
+            BeanUtils.copyProperties(dataProp, newProp);
+            ((ArrayRefProperty) newProp).set$ref(ref);
+            ((ArrayRefProperty) newProp).setType(ArrayRefProperty.TYPE);
+            if (!realType.equals(type)) {
+                SwaggerUtil.getNewProp(dataProp, realType, definitions);
+            }
+        } else if (SwaggerUtil.isBaseType(type)) {
+            Map<PropertyId, Object> args = new HashMap<PropertyId, Object>();
+            args.put(PropertyBuilder.PropertyId.DESCRIPTION, dataProp.getDescription());
+            args.put(PropertyBuilder.PropertyId.TYPE, type.toLowerCase());
+            AbstractProperty _prop = SwaggerUtil.getSwaggerProperty(type);
+            newProp = PropertyBuilder.build(_prop.getType(), _prop.getFormat(), args);
+            newProp.setName(dataProp.getName());
+        } else if (SwaggerUtil.hasRef(type)) {
+            newProp = new RefProperty();
+            BeanUtils.copyProperties(dataProp, newProp);
+            ((RefProperty) newProp).set$ref(type);
+        } else {
+        }
+        if (null != model) {
+            /*Map<String, Property> finalProps = props;
+            BaseEntity.types.forEach(key->{
+                finalProps.remove(key);
+            });*/
+            model.setProperties(props);
+        }
+        return newProp;
+    }
+    public static String[] splitByComma(String str) {
+        int index = 0;
+        int has = 0;
+        for (int i = 0; i < str.length(); i++) {
+            char c = str.charAt(i);
+            if ("«".equals(c + "")) {
+                has++;
+            }
+            if ("»".equals(c + "")) {
+                has--;
+            }
+            if (",".equals(c + "") && has == 0) {
+                index = i;
+            }
+        }
+        String[] arr = new String[2];
+        arr[0] = str.substring(0, index);
+        arr[1] = str.substring(index + 1);
+        return arr;
+    }
+    public static void main(String[] args) {
+        String[] ss = new String[] { "Result«AuctionOrder»" };
+        for (String s : ss) {
+            String c = SwaggerUtil.getRealType(s);
+            System.out.println(c);
+        }
+    }
+}

+ 145 - 0
poyee-base/src/main/java/com/poyee/common/swagger/TestController.java

@@ -0,0 +1,145 @@
+package com.poyee.common.swagger;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
+import org.springframework.web.servlet.resource.PathResourceResolver;
+import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
+import org.springframework.web.util.UrlPathHelper;
+import springfox.documentation.annotations.ApiIgnore;
+import springfox.documentation.spring.web.DocumentationCache;
+import springfox.documentation.spring.web.json.Json;
+import springfox.documentation.spring.web.json.JsonSerializer;
+import springfox.documentation.swagger.web.ApiResourceController;
+import springfox.documentation.swagger.web.SecurityConfiguration;
+import springfox.documentation.swagger.web.SwaggerResource;
+import springfox.documentation.swagger.web.UiConfiguration;
+import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+import springfox.documentation.swagger2.web.Swagger2Controller;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class TestController {
+    private static final String DEFAULT_PATH = "/test";
+    /**
+     * SwaggerUI资源访问
+     *
+     * @param servletContext
+     * @param order
+     * @return
+     * @throws Exception
+     */
+    @Bean
+    public SimpleUrlHandlerMapping swaggerUrlHandlerMapping(ServletContext servletContext,
+                                                            @Value("${swagger.mapping.order:10}") int order) throws Exception {
+        SimpleUrlHandlerMapping urlHandlerMapping = new SimpleUrlHandlerMapping();
+        Map<String, ResourceHttpRequestHandler> urlMap = new HashMap<>();
+        {
+            PathResourceResolver pathResourceResolver = new PathResourceResolver();
+            pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/webjars/"));
+            pathResourceResolver.setUrlPathHelper(new UrlPathHelper());
+            ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
+            resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/webjars/")));
+            resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
+            resourceHttpRequestHandler.setServletContext(servletContext);
+            resourceHttpRequestHandler.afterPropertiesSet();
+//设置新的路径
+            urlMap.put(DEFAULT_PATH + "/webjars/**", resourceHttpRequestHandler);
+        }
+        {
+            PathResourceResolver pathResourceResolver = new PathResourceResolver();
+            pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/"));
+            pathResourceResolver.setUrlPathHelper(new UrlPathHelper());
+            ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
+            resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/")));
+            resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
+            resourceHttpRequestHandler.setServletContext(servletContext);
+            resourceHttpRequestHandler.afterPropertiesSet();
+//设置新的路径
+            urlMap.put(DEFAULT_PATH + "/**", resourceHttpRequestHandler);
+        }
+        urlHandlerMapping.setUrlMap(urlMap);
+//调整DispatcherServlet关于SimpleUrlHandlerMapping的排序
+        urlHandlerMapping.setOrder(order);
+        return urlHandlerMapping;
+    }
+    /**
+     * SwaggerUI接口访问
+     */
+    @Controller
+    @ApiIgnore
+    @RequestMapping(DEFAULT_PATH)
+    public static class SwaggerResourceController implements InitializingBean {
+        @Autowired
+        private ApiResourceController apiResourceController;
+        @Autowired
+        private Environment environment;
+        @Autowired
+        private DocumentationCache documentationCache;
+        @Autowired
+        private ServiceModelToSwagger2Mapper mapper;
+        @Autowired
+        private JsonSerializer jsonSerializer;
+
+        private Swagger2Controller swagger2Controller;
+        @Autowired
+        private SwaggerUiController swaggerUiController;
+
+        @Override
+        public void afterPropertiesSet() {
+            swagger2Controller = new Swagger2Controller(environment, documentationCache, mapper, jsonSerializer);
+        }
+        /**
+         * 首页
+         *
+         * @return
+         */
+        @RequestMapping
+        public ModelAndView index() {
+            ModelAndView modelAndView = new ModelAndView("redirect:" + DEFAULT_PATH + "/swagger-ui.html");
+            return modelAndView;
+        }
+        @RequestMapping("/swagger-resources/configuration/security")
+        @ResponseBody
+        public ResponseEntity<SecurityConfiguration> securityConfiguration() {
+            ResponseEntity<SecurityConfiguration> securityConfigurationResponseEntity = apiResourceController.securityConfiguration();
+            return securityConfigurationResponseEntity;
+        }
+        @RequestMapping("/swagger-resources/configuration/ui")
+        @ResponseBody
+        public ResponseEntity<UiConfiguration> uiConfiguration() {
+            return apiResourceController.uiConfiguration();
+        }
+        @RequestMapping("/swagger-resources")
+        @ResponseBody
+        public ResponseEntity<List<SwaggerResource>> swaggerResources() {
+            ResponseEntity<List<SwaggerResource>> listResponseEntity = apiResourceController.swaggerResources();
+            return listResponseEntity;
+        }
+        @RequestMapping(value = "/v2/api-docs-poyee", method = RequestMethod.GET, produces = {"application/json", "application/hal+json"})
+        @ResponseBody
+        public ResponseEntity<Json> getDocumentation(
+                @RequestParam(value = "group", required = false) String swaggerGroup,
+                HttpServletRequest servletRequest) {
+            return swaggerUiController.apiSorts(swaggerGroup, servletRequest);
+        }
+    }
+}

+ 183 - 0
poyee-base/src/main/java/com/poyee/common/util/EscapeUtil.java

@@ -0,0 +1,183 @@
+package com.poyee.common.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * 转义和反转义工具类
+ * 
+ * @author zheng
+ */
+public class EscapeUtil
+{
+    public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
+
+    private static final char[][] TEXT = new char[64][];
+    private static final Set<String> sqlText = new HashSet<>();
+
+    static
+    {
+        for (int i = 0; i < 64; i++)
+        {
+            TEXT[i] = new char[] { (char) i };
+        }
+        // special HTML characters
+        TEXT['\''] = "&#039;".toCharArray(); // 单引号
+        TEXT['"'] = "&#34;".toCharArray(); // 单引号
+        TEXT['&'] = "&#38;".toCharArray(); // &符
+        TEXT['<'] = "&#60;".toCharArray(); // 小于号
+        TEXT['>'] = "&#62;".toCharArray(); // 大于号
+        //
+        sqlText.add("update");//更新数据
+        sqlText.add("delete");//删除数据
+        sqlText.add("drop");//删除表
+        sqlText.add("truncate");//清空表
+        sqlText.add("pg_sleep");//函数 sleep
+        sqlText.add("sleep");//函数 sleep
+        sqlText.add("rmi");//关键字 rmi
+        sqlText.add("jndi");//关键字 jndi
+        sqlText.add("pass");//参数 pass
+        sqlText.add("password");//参数 password
+        sqlText.add("pwd");//参数 pwd
+
+    }
+
+    public static String clearSqlText(String value){
+        if(StringUtils.isEmpty(value)) return value;
+        AtomicBoolean retb = new AtomicBoolean(false);
+        sqlText.forEach(str->{
+            if(str.trim().equals(value.trim())){
+                value.replaceAll(str,"");
+            }
+        });
+        return value;
+    }
+
+    /**
+     * 转义文本中的HTML字符为安全的字符
+     * 
+     * @param text 被转义的文本
+     * @return 转义后的文本
+     */
+    public static String escape(String text)
+    {
+        return encode(text);
+    }
+
+    /**
+     * 还原被转义的HTML特殊字符
+     * 
+     * @param content 包含转义符的HTML内容
+     * @return 转换后的字符串
+     */
+    public static String unescape(String content)
+    {
+        return decode(content);
+    }
+
+    /**
+     * 清除所有HTML标签,但是不删除标签内的内容
+     * 
+     * @param content 文本
+     * @return 清除标签后的文本
+     */
+    public static String clean(String content)
+    {
+        return new HTMLFilter().filter(content);
+    }
+
+    /**
+     * Escape编码
+     * 
+     * @param text 被编码的文本
+     * @return 编码后的字符
+     */
+    private static String encode(String text)
+    {
+        int len;
+        if ((text == null) || ((len = text.length()) == 0))
+        {
+            return StringUtils.EMPTY;
+        }
+        StringBuilder buffer = new StringBuilder(len + (len >> 2));
+        char c;
+        for (int i = 0; i < len; i++)
+        {
+            c = text.charAt(i);
+            if (c < 64)
+            {
+                buffer.append(TEXT[c]);
+            }
+            else
+            {
+                buffer.append(c);
+            }
+        }
+        return buffer.toString();
+    }
+
+    /**
+     * Escape解码
+     * 
+     * @param content 被转义的内容
+     * @return 解码后的字符串
+     */
+    public static String decode(String content)
+    {
+        if (StringUtils.isEmpty(content))
+        {
+            return content;
+        }
+
+        StringBuilder tmp = new StringBuilder(content.length());
+        int lastPos = 0, pos = 0;
+        char ch;
+        while (lastPos < content.length())
+        {
+            pos = content.indexOf("%", lastPos);
+            if (pos == lastPos)
+            {
+                if (content.charAt(pos + 1) == 'u')
+                {
+                    ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
+                    tmp.append(ch);
+                    lastPos = pos + 6;
+                }
+                else
+                {
+                    ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
+                    tmp.append(ch);
+                    lastPos = pos + 3;
+                }
+            }
+            else
+            {
+                if (pos == -1)
+                {
+                    tmp.append(content.substring(lastPos));
+                    lastPos = content.length();
+                }
+                else
+                {
+                    tmp.append(content.substring(lastPos, pos));
+                    lastPos = pos;
+                }
+            }
+        }
+        return tmp.toString();
+    }
+
+    public static void main(String[] args)
+    {
+        String html = "<script>alert(1);</script>";
+        // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
+        // String html = "<123";
+        // String html = "123>";
+        System.out.println(EscapeUtil.clean(html));
+        System.out.println(EscapeUtil.escape(html));
+        System.out.println(EscapeUtil.unescape(html));
+    }
+}

+ 566 - 0
poyee-base/src/main/java/com/poyee/common/util/HTMLFilter.java

@@ -0,0 +1,566 @@
+package com.poyee.common.util;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * HTML过滤器,用于去除XSS漏洞隐患。
+ *
+ * @author zheng
+ */
+public final class HTMLFilter
+{
+    /**
+     * regex flag union representing /si modifiers in php
+     **/
+    private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
+    private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
+    private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
+    private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
+    private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
+    private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
+    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
+    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
+    private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
+    private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
+    private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
+    private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
+    private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
+    private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
+    private static final Pattern P_END_ARROW = Pattern.compile("^>");
+    private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_AMP = Pattern.compile("&");
+    private static final Pattern P_QUOTE = Pattern.compile("\"");
+    private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
+    private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
+    private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
+
+    // @xxx could grow large... maybe use sesat's ReferenceMap
+    private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();
+    private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();
+
+    /**
+     * set of allowed html elements, along with allowed attributes for each element
+     **/
+    private final Map<String, List<String>> vAllowed;
+    /**
+     * counts of open tags for each (allowable) html element
+     **/
+    private final Map<String, Integer> vTagCounts = new HashMap<>();
+
+    /**
+     * html elements which must always be self-closing (e.g. "<img />")
+     **/
+    private final String[] vSelfClosingTags;
+    /**
+     * html elements which must always have separate opening and closing tags (e.g. "<b></b>")
+     **/
+    private final String[] vNeedClosingTags;
+    /**
+     * set of disallowed html elements
+     **/
+    private final String[] vDisallowed;
+    /**
+     * attributes which should be checked for valid protocols
+     **/
+    private final String[] vProtocolAtts;
+    /**
+     * allowed protocols
+     **/
+    private final String[] vAllowedProtocols;
+    /**
+     * tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")
+     **/
+    private final String[] vRemoveBlanks;
+    /**
+     * entities allowed within html markup
+     **/
+    private final String[] vAllowedEntities;
+    /**
+     * flag determining whether comments are allowed in input String.
+     */
+    private final boolean stripComment;
+    private final boolean encodeQuotes;
+    /**
+     * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"
+     * becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.
+     */
+    private final boolean alwaysMakeTags;
+
+    /**
+     * Default constructor.
+     */
+    public HTMLFilter()
+    {
+        vAllowed = new HashMap<>();
+
+        final ArrayList<String> a_atts = new ArrayList<>();
+        a_atts.add("href");
+        a_atts.add("target");
+        vAllowed.put("a", a_atts);
+
+        final ArrayList<String> img_atts = new ArrayList<>();
+        img_atts.add("src");
+        img_atts.add("width");
+        img_atts.add("height");
+        img_atts.add("alt");
+        vAllowed.put("img", img_atts);
+
+        final ArrayList<String> no_atts = new ArrayList<>();
+        vAllowed.put("b", no_atts);
+        vAllowed.put("strong", no_atts);
+        vAllowed.put("i", no_atts);
+        vAllowed.put("em", no_atts);
+
+        vSelfClosingTags = new String[] { "img" };
+        vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
+        vDisallowed = new String[] {};
+        vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
+        vProtocolAtts = new String[] { "src", "href" };
+        vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
+        vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
+        stripComment = true;
+        encodeQuotes = true;
+        alwaysMakeTags = false;
+    }
+
+    /**
+     * Map-parameter configurable constructor.
+     *
+     * @param conf map containing configuration. keys match field names.
+     */
+    @SuppressWarnings("unchecked")
+    public HTMLFilter(final Map<String, Object> conf)
+    {
+
+        assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
+        assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
+        assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
+        assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
+        assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
+        assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
+        assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
+        assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
+
+        vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
+        vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
+        vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
+        vDisallowed = (String[]) conf.get("vDisallowed");
+        vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
+        vProtocolAtts = (String[]) conf.get("vProtocolAtts");
+        vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
+        vAllowedEntities = (String[]) conf.get("vAllowedEntities");
+        stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
+        encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
+        alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
+    }
+
+    private void reset()
+    {
+        vTagCounts.clear();
+    }
+
+    // ---------------------------------------------------------------
+    // my versions of some PHP library functions
+    public static String chr(final int decimal)
+    {
+        return String.valueOf((char) decimal);
+    }
+
+    public static String htmlSpecialChars(final String s)
+    {
+        String result = s;
+        result = regexReplace(P_AMP, "&amp;", result);
+        result = regexReplace(P_QUOTE, "&quot;", result);
+        result = regexReplace(P_LEFT_ARROW, "&lt;", result);
+        result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
+        return result;
+    }
+
+    // ---------------------------------------------------------------
+
+    /**
+     * given a user submitted input String, filter out any invalid or restricted html.
+     *
+     * @param input text (i.e. submitted by a user) than may contain html
+     * @return "clean" version of input, with only valid, whitelisted html elements allowed
+     */
+    public String filter(final String input)
+    {
+        reset();
+        String s = input;
+
+        s = escapeComments(s);
+
+        s = balanceHTML(s);
+
+        s = checkTags(s);
+
+        s = processRemoveBlanks(s);
+
+        // s = validateEntities(s);
+
+        return s;
+    }
+
+    public boolean isAlwaysMakeTags()
+    {
+        return alwaysMakeTags;
+    }
+
+    public boolean isStripComments()
+    {
+        return stripComment;
+    }
+
+    private String escapeComments(final String s)
+    {
+        final Matcher m = P_COMMENTS.matcher(s);
+        final StringBuffer buf = new StringBuffer();
+        if (m.find())
+        {
+            final String match = m.group(1); // (.*?)
+            m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
+        }
+        m.appendTail(buf);
+
+        return buf.toString();
+    }
+
+    private String balanceHTML(String s)
+    {
+        if (alwaysMakeTags)
+        {
+            //
+            // try and form html
+            //
+            s = regexReplace(P_END_ARROW, "", s);
+            // 不追加结束标签
+            s = regexReplace(P_BODY_TO_END, "<$1>", s);
+            s = regexReplace(P_XML_CONTENT, "$1<$2", s);
+
+        }
+        else
+        {
+            //
+            // escape stray brackets
+            //
+            s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
+            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
+
+            //
+            // the last regexp causes '<>' entities to appear
+            // (we need to do a lookahead assertion so that the last bracket can
+            // be used in the next pass of the regexp)
+            //
+            s = regexReplace(P_BOTH_ARROWS, "", s);
+        }
+
+        return s;
+    }
+
+    private String checkTags(String s)
+    {
+        Matcher m = P_TAGS.matcher(s);
+
+        final StringBuffer buf = new StringBuffer();
+        while (m.find())
+        {
+            String replaceStr = m.group(1);
+            replaceStr = processTag(replaceStr);
+            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
+        }
+        m.appendTail(buf);
+
+        // these get tallied in processTag
+        // (remember to reset before subsequent calls to filter method)
+        final StringBuilder sBuilder = new StringBuilder(buf.toString());
+        for (String key : vTagCounts.keySet())
+        {
+            for (int ii = 0; ii < vTagCounts.get(key); ii++)
+            {
+                sBuilder.append("</").append(key).append(">");
+            }
+        }
+        s = sBuilder.toString();
+
+        return s;
+    }
+
+    private String processRemoveBlanks(final String s)
+    {
+        String result = s;
+        for (String tag : vRemoveBlanks)
+        {
+            if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
+            {
+                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
+            }
+            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
+            if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
+            {
+                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
+            }
+            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
+        }
+
+        return result;
+    }
+
+    private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
+    {
+        Matcher m = regex_pattern.matcher(s);
+        return m.replaceAll(replacement);
+    }
+
+    private String processTag(final String s)
+    {
+        // ending tags
+        Matcher m = P_END_TAG.matcher(s);
+        if (m.find())
+        {
+            final String name = m.group(1).toLowerCase();
+            if (allowed(name))
+            {
+                if (false == inArray(name, vSelfClosingTags))
+                {
+                    if (vTagCounts.containsKey(name))
+                    {
+                        vTagCounts.put(name, vTagCounts.get(name) - 1);
+                        return "</" + name + ">";
+                    }
+                }
+            }
+        }
+
+        // starting tags
+        m = P_START_TAG.matcher(s);
+        if (m.find())
+        {
+            final String name = m.group(1).toLowerCase();
+            final String body = m.group(2);
+            String ending = m.group(3);
+
+            // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
+            if (allowed(name))
+            {
+                final StringBuilder params = new StringBuilder();
+
+                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
+                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
+                final List<String> paramNames = new ArrayList<>();
+                final List<String> paramValues = new ArrayList<>();
+                while (m2.find())
+                {
+                    paramNames.add(m2.group(1)); // ([a-z0-9]+)
+                    paramValues.add(m2.group(3)); // (.*?)
+                }
+                while (m3.find())
+                {
+                    paramNames.add(m3.group(1)); // ([a-z0-9]+)
+                    paramValues.add(m3.group(3)); // ([^\"\\s']+)
+                }
+
+                String paramName, paramValue;
+                for (int ii = 0; ii < paramNames.size(); ii++)
+                {
+                    paramName = paramNames.get(ii).toLowerCase();
+                    paramValue = paramValues.get(ii);
+
+                    // debug( "paramName='" + paramName + "'" );
+                    // debug( "paramValue='" + paramValue + "'" );
+                    // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
+
+                    if (allowedAttribute(name, paramName))
+                    {
+                        if (inArray(paramName, vProtocolAtts))
+                        {
+                            paramValue = processParamProtocol(paramValue);
+                        }
+                        params.append(' ').append(paramName).append("=\"").append(paramValue).append("\"");
+                    }
+                }
+
+                if (inArray(name, vSelfClosingTags))
+                {
+                    ending = " /";
+                }
+
+                if (inArray(name, vNeedClosingTags))
+                {
+                    ending = "";
+                }
+
+                if (ending == null || ending.length() < 1)
+                {
+                    if (vTagCounts.containsKey(name))
+                    {
+                        vTagCounts.put(name, vTagCounts.get(name) + 1);
+                    }
+                    else
+                    {
+                        vTagCounts.put(name, 1);
+                    }
+                }
+                else
+                {
+                    ending = " /";
+                }
+                return "<" + name + params + ending + ">";
+            }
+            else
+            {
+                return "";
+            }
+        }
+
+        // comments
+        m = P_COMMENT.matcher(s);
+        if (!stripComment && m.find())
+        {
+            return "<" + m.group() + ">";
+        }
+
+        return "";
+    }
+
+    private String processParamProtocol(String s)
+    {
+        s = decodeEntities(s);
+        final Matcher m = P_PROTOCOL.matcher(s);
+        if (m.find())
+        {
+            final String protocol = m.group(1);
+            if (!inArray(protocol, vAllowedProtocols))
+            {
+                // bad protocol, turn into local anchor link instead
+                s = "#" + s.substring(protocol.length() + 1);
+                if (s.startsWith("#//"))
+                {
+                    s = "#" + s.substring(3);
+                }
+            }
+        }
+
+        return s;
+    }
+
+    private String decodeEntities(String s)
+    {
+        StringBuffer buf = new StringBuffer();
+
+        Matcher m = P_ENTITY.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.decode(match).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENTITY_UNICODE.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENCODE.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        s = validateEntities(s);
+        return s;
+    }
+
+    private String validateEntities(final String s)
+    {
+        StringBuffer buf = new StringBuffer();
+
+        // validate entities throughout the string
+        Matcher m = P_VALID_ENTITIES.matcher(s);
+        while (m.find())
+        {
+            final String one = m.group(1); // ([^&;]*)
+            final String two = m.group(2); // (?=(;|&|$))
+            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
+        }
+        m.appendTail(buf);
+
+        return encodeQuotes(buf.toString());
+    }
+
+    private String encodeQuotes(final String s)
+    {
+        if (encodeQuotes)
+        {
+            StringBuffer buf = new StringBuffer();
+            Matcher m = P_VALID_QUOTES.matcher(s);
+            while (m.find())
+            {
+                final String one = m.group(1); // (>|^)
+                final String two = m.group(2); // ([^<]+?)
+                final String three = m.group(3); // (<|$)
+                // 不替换双引号为&quot;,防止json格式无效 regexReplace(P_QUOTE, "&quot;", two)
+                m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));
+            }
+            m.appendTail(buf);
+            return buf.toString();
+        }
+        else
+        {
+            return s;
+        }
+    }
+
+    private String checkEntity(final String preamble, final String term)
+    {
+
+        return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&amp;" + preamble;
+    }
+
+    private boolean isValidEntity(final String entity)
+    {
+        return inArray(entity, vAllowedEntities);
+    }
+
+    private static boolean inArray(final String s, final String[] array)
+    {
+        for (String item : array)
+        {
+            if (item != null && item.equals(s))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean allowed(final String name)
+    {
+        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
+    }
+
+    private boolean allowedAttribute(final String name, final String paramName)
+    {
+        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
+    }
+}

+ 17 - 0
poyee-base/src/main/java/com/poyee/common/util/LogSyncUtil.java

@@ -0,0 +1,17 @@
+package com.poyee.common.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author by po'yi
+ * @Classname LogSyncUtil
+ * @Description 记录异步日志
+ * @Date 2023/6/2 13:43
+ */
+@Slf4j
+public class LogSyncUtil {
+
+	public static void logSync(String msg, Object... params){
+		log.info(msg, params);
+	}
+}

+ 26 - 0
poyee-base/src/main/java/com/poyee/common/util/MessageUtils.java

@@ -0,0 +1,26 @@
+package com.poyee.common.util;
+
+import com.poyee.util.SpringUtils;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+/**
+ * 获取i18n资源文件
+ * 
+ * @author zheng
+ */
+public class MessageUtils
+{
+    /**
+     * 根据消息键和参数 获取消息 委托给spring messageSource
+     *
+     * @param code 消息键
+     * @param args 参数
+     * @return 获取国际化翻译值
+     */
+    public static String message(String code, Object... args)
+    {
+        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
+        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+    }
+}

+ 93 - 0
poyee-base/src/main/java/com/poyee/common/xss/XssFilter.java

@@ -0,0 +1,93 @@
+package com.poyee.common.xss;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 防止XSS攻击的过滤器
+ * 
+ * @author zheng
+ */
+public class XssFilter implements Filter
+{
+    /**
+     * 排除链接
+     */
+    public List<String> excludes = new ArrayList<>();
+
+    /**
+     * xss过滤开关
+     */
+    public boolean enabled = false;
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
+        String tempExcludes = filterConfig.getInitParameter("excludes");
+        String tempEnabled = filterConfig.getInitParameter("enabled");
+        if (StringUtils.isNotEmpty(tempExcludes))
+        {
+            String[] url = tempExcludes.split(",");
+            for (int i = 0; url != null && i < url.length; i++)
+            {
+                excludes.add(url[i]);
+            }
+        }
+        if (StringUtils.isNotEmpty(tempEnabled))
+        {
+            enabled = Boolean.valueOf(tempEnabled);
+        }
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException
+    {
+        HttpServletRequest req = (HttpServletRequest) request;
+        HttpServletResponse resp = (HttpServletResponse) response;
+        if (handleExcludeURL(req, resp))
+        {
+            chain.doFilter(request, response);
+            return;
+        }
+        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
+        chain.doFilter(xssRequest, response);
+    }
+
+    private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
+    {
+        if (!enabled)
+        {
+            return true;
+        }
+        if (excludes == null || excludes.isEmpty())
+        {
+            return false;
+        }
+        String url = request.getServletPath();
+        for (String pattern : excludes)
+        {
+            Pattern p = Pattern.compile("^" + pattern);
+            Matcher m = p.matcher(url);
+            if (m.find())
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void destroy()
+    {
+
+    }
+}

+ 45 - 0
poyee-base/src/main/java/com/poyee/common/xss/XssHttpServletRequestWrapper.java

@@ -0,0 +1,45 @@
+package com.poyee.common.xss;
+
+import com.poyee.common.util.EscapeUtil;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+/**
+ * XSS过滤处理
+ * 
+ * @author zheng
+ */
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
+{
+    /**
+     * @param request
+     */
+    public XssHttpServletRequestWrapper(HttpServletRequest request)
+    {
+        super(request);
+    }
+
+    @Override
+    public String[] getParameterValues(String name)
+    {
+
+        //添加 sql 注入
+//            escapseValues = EscapeUtil.clearSqlText(name);
+
+        String[] values = super.getParameterValues(name);
+        if (values != null)
+        {
+            int length = values.length;
+            String[] escapseValues = new String[length];
+            for (int i = 0; i < length; i++)
+            {
+                // 防xss攻击和过滤前后空格
+                escapseValues[i] = EscapeUtil.clean(values[i]).trim();
+            }
+
+            return escapseValues;
+        }
+        return super.getParameterValues(name);
+    }
+}

+ 20 - 0
poyee-base/src/main/java/com/poyee/framework/annotation/Desensit.java

@@ -0,0 +1,20 @@
+package com.poyee.framework.annotation;
+
+import com.poyee.common.enums.DesensitType;
+
+import java.lang.annotation.*;
+
+/**
+ * 脱敏规则
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Desensit {
+    //脱敏字段
+    public String field() default "";
+    //脱敏类型
+    public DesensitType type() default DesensitType.DEFAULT;
+
+
+}

+ 16 - 0
poyee-base/src/main/java/com/poyee/framework/annotation/DesensitMethod.java

@@ -0,0 +1,16 @@
+package com.poyee.framework.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 脱敏规则
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface DesensitMethod {
+
+    boolean desensit() default true;
+
+
+}

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio