完善扫码消费初始化接口
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
index 86c57a8..7c59309 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
@@ -5,8 +5,13 @@
  */
 package com.supwisdom.dlpay.api;
 
+import com.supwisdom.dlpay.payapi.model.ErrorResponse;
 import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmRequest;
+import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmResponse;
 import com.supwisdom.dlpay.payapi.model.QrcodePayInitRequest;
+import com.supwisdom.dlpay.payapi.model.QrcodePayInitResponse;
+import com.supwisdom.dlpay.payapi.model.RefundRequest;
+import com.supwisdom.dlpay.payapi.model.RefundResponse;
 import io.swagger.annotations.*;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -27,7 +32,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2020-03-12T16:17:20.799+08:00[Asia/Shanghai]")
+@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2020-03-17T08:49:02.541+08:00[Asia/Shanghai]")
 
 @Validated
 @Api(value = "consume", description = "the consume API")
@@ -37,43 +42,117 @@
         return Optional.empty();
     }
 
-    @ApiOperation(value = "", nickname = "qrcodePayConfirm", notes = "", tags={ "pos", })
+    @ApiOperation(value = "", nickname = "qrcodePayConfirm", notes = "", response = QrcodePayConfirmResponse.class, tags={ "pos", })
     @ApiResponses(value = { 
-        @ApiResponse(code = 200, message = "交易成功"),
-        @ApiResponse(code = 409, message = "交易正忙,稍后重试"),
-        @ApiResponse(code = 200, message = "交易失败") })
+        @ApiResponse(code = 200, message = "交易成功", response = QrcodePayConfirmResponse.class),
+        @ApiResponse(code = 409, message = "交易正忙,稍后重试", response = ErrorResponse.class),
+        @ApiResponse(code = 200, message = "交易失败", response = ErrorResponse.class) })
     @RequestMapping(value = "/consume/qrcode/confirm",
         produces = { "application/json" }, 
         consumes = { "application/json" },
         method = RequestMethod.POST)
-    default ResponseEntity<Void> qrcodePayConfirm(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "Qrcode确认"  )  @Valid @RequestBody QrcodePayConfirmRequest qrcodePayConfirmRequest) {
+    default ResponseEntity<QrcodePayConfirmResponse> qrcodePayConfirm(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "Qrcode确认"  )  @Valid @RequestBody QrcodePayConfirmRequest qrcodePayConfirmRequest) {
+        getRequest().ifPresent(request -> {
+            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+                    String exampleString = "{ \"hostTime\" : \"hostTime\", \"refno\" : \"refno\", \"hostDate\" : \"hostDate\", \"description\" : \"description\" }";
+                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
+                    break;
+                }
+            }
+        });
         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
     }
 
 
-    @ApiOperation(value = "", nickname = "qrcodePayInit", notes = "", tags={ "pos", })
+    @ApiOperation(value = "", nickname = "qrcodePayInit", notes = "", response = QrcodePayInitResponse.class, tags={ "pos", })
     @ApiResponses(value = { 
-        @ApiResponse(code = 200, message = "初始化成功"),
-        @ApiResponse(code = 200, message = "请求错误") })
+        @ApiResponse(code = 200, message = "初始化成功", response = QrcodePayInitResponse.class),
+        @ApiResponse(code = 200, message = "请求错误", response = ErrorResponse.class) })
     @RequestMapping(value = "/consume/qrcode/init",
         produces = { "application/json" }, 
         consumes = { "application/json" },
         method = RequestMethod.POST)
-    default ResponseEntity<Void> qrcodePayInit(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "QrCode 初始化"  )  @Valid @RequestBody QrcodePayInitRequest qrcodePayInitRequest) {
+    default ResponseEntity<QrcodePayInitResponse> qrcodePayInit(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "QrCode 初始化"  )  @Valid @RequestBody QrcodePayInitRequest qrcodePayInitRequest) {
+        getRequest().ifPresent(request -> {
+            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+                    String exampleString = "{ \"anonymous\" : true, \"sourcetype\" : \"sourcetype\", \"userid\" : \"userid\", \"username\" : \"username\" }";
+                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
+                    break;
+                }
+            }
+        });
         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
     }
 
 
-    @ApiOperation(value = "", nickname = "qrcodePayQuery", notes = "根据系统交易参考号查询流水状态", tags={ "pos", })
+    @ApiOperation(value = "", nickname = "qrcodePayQuery", notes = "根据系统交易参考号查询流水状态", response = QrcodePayConfirmResponse.class, tags={ "pos", })
     @ApiResponses(value = { 
-        @ApiResponse(code = 200, message = "查询成功"),
-        @ApiResponse(code = 200, message = "查询失败") })
+        @ApiResponse(code = 200, message = "查询成功", response = QrcodePayConfirmResponse.class),
+        @ApiResponse(code = 200, message = "查询失败", response = ErrorResponse.class) })
     @RequestMapping(value = "/consume/qrcode/query/{refno}",
         produces = { "application/json" }, 
         method = RequestMethod.GET)
-    default ResponseEntity<Void> qrcodePayQuery(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "系统交易参考号",required=true) @PathVariable("refno") String refno) {
+    default ResponseEntity<QrcodePayConfirmResponse> qrcodePayQuery(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "系统交易参考号",required=true) @PathVariable("refno") String refno) {
+        getRequest().ifPresent(request -> {
+            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+                    String exampleString = "{ \"hostTime\" : \"hostTime\", \"refno\" : \"refno\", \"hostDate\" : \"hostDate\", \"description\" : \"description\" }";
+                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
+                    break;
+                }
+            }
+        });
+        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+    }
+
+
+    @ApiOperation(value = "", nickname = "refund", notes = "退款交易", response = RefundResponse.class, tags={ "pos", })
+    @ApiResponses(value = { 
+        @ApiResponse(code = 200, message = "退款申请成功,等待查询", response = RefundResponse.class),
+        @ApiResponse(code = 409, message = "退款申请失败,订单号已存在或正在退款中", response = ErrorResponse.class),
+        @ApiResponse(code = 200, message = "退款申请失败", response = ErrorResponse.class) })
+    @RequestMapping(value = "/consume/refund",
+        produces = { "application/json" }, 
+        consumes = { "application/json" },
+        method = RequestMethod.POST)
+    default ResponseEntity<RefundResponse> refund(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = ""  )  @Valid @RequestBody RefundRequest refundRequest) {
+        getRequest().ifPresent(request -> {
+            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+                    String exampleString = "{ \"hostTime\" : \"hostTime\", \"refno\" : \"refno\", \"hostDate\" : \"hostDate\", \"billno\" : \"billno\" }";
+                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
+                    break;
+                }
+            }
+        });
+        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+    }
+
+
+    @ApiOperation(value = "", nickname = "refundQuery", notes = "退款申请查询", response = RefundResponse.class, tags={ "pos", })
+    @ApiResponses(value = { 
+        @ApiResponse(code = 200, message = "退款申请查询成功", response = RefundResponse.class),
+        @ApiResponse(code = 404, message = "退款申请订单不存在", response = ErrorResponse.class),
+        @ApiResponse(code = 200, message = "退款申请失败", response = ErrorResponse.class) })
+    @RequestMapping(value = "/consume/refund/query/{billno}",
+        produces = { "application/json" }, 
+        method = RequestMethod.GET)
+    default ResponseEntity<RefundResponse> refundQuery(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "退款订单号",required=true) @PathVariable("billno") String billno) {
+        getRequest().ifPresent(request -> {
+            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+                    String exampleString = "{ \"hostTime\" : \"hostTime\", \"refno\" : \"refno\", \"hostDate\" : \"hostDate\", \"billno\" : \"billno\" }";
+                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
+                    break;
+                }
+            }
+        });
         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
     }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApiController.java b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApiController.java
index dc318fe..7aac744 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApiController.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApiController.java
@@ -4,22 +4,22 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.context.request.NativeWebRequest;
 import java.util.Optional;
-@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2020-03-12T16:09:45.966+08:00[Asia/Shanghai]")
-
-@Controller
-@RequestMapping("${openapi.aPITitle.base-path:/api}")
-public class ConsumeApiController implements ConsumeApi {
-
-    private final NativeWebRequest request;
-
-    @org.springframework.beans.factory.annotation.Autowired
-    public ConsumeApiController(NativeWebRequest request) {
-        this.request = request;
-    }
-
-    @Override
-    public Optional<NativeWebRequest> getRequest() {
-        return Optional.ofNullable(request);
-    }
-
-}
+//@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2020-03-12T16:09:45.966+08:00[Asia/Shanghai]")
+//
+//@Controller
+//@RequestMapping("${openapi.aPITitle.base-path:/api}")
+//public class ConsumeApiController implements ConsumeApi {
+//
+//    private final NativeWebRequest request;
+//
+//    @org.springframework.beans.factory.annotation.Autowired
+//    public ConsumeApiController(NativeWebRequest request) {
+//        this.request = request;
+//    }
+//
+//    @Override
+//    public Optional<NativeWebRequest> getRequest() {
+//        return Optional.ofNullable(request);
+//    }
+//
+//}
diff --git a/payapi/src/main/java/org/openapitools/configuration/HomeController.java b/payapi/src/main/java/org/openapitools/configuration/HomeController.java
index 2572783..2697428 100644
--- a/payapi/src/main/java/org/openapitools/configuration/HomeController.java
+++ b/payapi/src/main/java/org/openapitools/configuration/HomeController.java
@@ -7,13 +7,13 @@
 /**
  * Home redirection to OpenAPI api documentation
  */
-@Controller
-public class HomeController {
-
-    @RequestMapping("/")
-    public String index() {
-        return "redirect:swagger-ui.html";
-    }
-
-
-}
+//@Controller
+//public class HomeController {
+//
+//    @RequestMapping("/")
+//    public String index() {
+//        return "redirect:swagger-ui.html";
+//    }
+//
+//
+//}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
index 5fe60fe..9aff498 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
@@ -3,22 +3,21 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentPayServiceContext
+import com.supwisdom.dlpay.agent.domain.QrcodePattern
 import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.agent.service.AgentServiceProxy
 import com.supwisdom.dlpay.api.bean.QrcodePayResponse
 import com.supwisdom.dlpay.api.service.*
+import com.supwisdom.dlpay.exception.BadRequestError
 import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.Dictionary
-import com.supwisdom.dlpay.framework.util.TradeCode
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmRequest
 import com.supwisdom.dlpay.payapi.model.QrcodePayInitRequest
 import com.supwisdom.dlpay.payapi.model.QrcodePayInitResponse
+import com.supwisdom.multitenant.TenantContextHolder
 import org.apache.commons.lang3.StringUtils
-import org.springframework.http.HttpStatus
 import org.springframework.http.ResponseEntity
 import org.springframework.stereotype.Controller
 import org.springframework.web.bind.annotation.RequestMapping
@@ -38,25 +37,28 @@
             private val userService: UserService,
             private val consumePayService: ConsumePayService,
             private val transactionService: TransactionServiceProxy,
-            private val accountUtilServcie: AccountUtilServcie ) : ConsumeApi {
+            private val accountUtilServcie: AccountUtilServcie) : ConsumeApi {
 
     override fun getRequest(): Optional<NativeWebRequest> {
         return Optional.ofNullable(request)
     }
 
-    override fun qrcodePayInit(xTenantId: String, @Valid param: QrcodePayInitRequest): ResponseEntity<Void> {
+    override fun qrcodePayInit(xTenantId: String, @Valid param: QrcodePayInitRequest): ResponseEntity<QrcodePayInitResponse> {
+        TenantContextHolder.getContext().tenant.id = "{tenantid}"
         val apiResp = QrcodePayInitResponse()
         // 1. 检查 qrcode
-        val qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
-                ?: return ResponseBodyBuilder.badRequest("未识别的支付码") as ResponseEntity<Void>
-
+        val qrcode: QrcodePattern
+        try {
+            qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
+                    ?: throw BadRequestError("未识别的支付码")
+        } catch (e: Exception) {
+            throw BadRequestError(e.message!!)
+        }
         val sourceType = sourceTypeService.getBySourceType(qrcode.sourceType)
-                ?: return ResponseBodyBuilder.badRequest(
-                        "不支持的支付方式<${qrcode.sourceType}>") as ResponseEntity<Void>
+                ?: throw BadRequestError("不支持的支付方式<${qrcode.sourceType}>")
         if (sourceType.paySubjno.isEmpty()
                 || !StringUtils.isNumeric(sourceType.paySubjno)) {
-            return ResponseBodyBuilder.notFound(
-                    "支付方式<${qrcode.sourceType}>未配置科目号") as ResponseEntity<Void>
+            throw BadRequestError("支付方式<${qrcode.sourceType}>未配置科目号")
         }
         val systime = systemUtilService.sysdatetime
         // 2. 记录 qrcode 交易明细表
@@ -83,45 +85,35 @@
         return when (agentResp.code) {
             AgentCode.SUCCESS -> {
                 val qrcodeTransResp = agentResp.payload
-                // 更新qrcode交易明细表 是否匿名 字段
-                agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans.also{
-                    it.isAnonymous = qrcodeTransResp.isAnonymous
-                })
                 if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) {
-                    ResponseBodyBuilder.failEntity(apiResp,
-                            HttpStatus.BAD_REQUEST.value(),
-                            "支付方式<${qrcode.sourceType}> 不支持匿名支付") as ResponseEntity<Void>
+                    throw BadRequestError("支付方式<${qrcode.sourceType}> 不支持匿名支付")
                 } else {
-                    val person = userService.findByUseridOrThirdUniqueIdenty(qrcodeTransResp.userid, null)
-                    ResponseBodyBuilder.successEntity(
-                            QrcodePayInitResponse().apply {
-                                this.anonymous = qrcodeTransResp.isAnonymous
-                                this.sourcetype = sourceType.sourceType
+                    // 更新qrcode交易明细表 是否匿名 字段
+                    if (StringUtil.isEmpty(qrcodeTransResp.userid)) {
+                        qrcodeTransResp.isAnonymous = true
+                    } else {
+                        val person = userService.findByUseridOrThirdUniqueIdenty(qrcodeTransResp.userid, null)
+                        if (person == null) {
+                            qrcodeTransResp.isAnonymous = true
+                        } else {
+                            apiResp.apply {
+                                qrcodeTransResp.isAnonymous = false
                                 this.userid = qrcodeTransResp.agentUserId
-                                this.username = person!!.name
+                                this.username = person.name
                             }
-                    ) as ResponseEntity<Void>
+                        }
+                    }
+                    agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans.also {
+                        it.isAnonymous = qrcodeTransResp.isAnonymous
+                    })
+                    ResponseBodyBuilder.ok(apiResp)
                 }
             }
             AgentCode.NOT_SUPPORT -> {
-                val qrcodeTransResp = agentResp.payload
-                agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans.also{
-                    it.isAnonymous = qrcodeTransResp.isAnonymous
-                })
-                if (!sourceType.anonymousEnable) {
-                    ResponseBodyBuilder.failEntity(apiResp,
-                            HttpStatus.BAD_REQUEST.value(),
-                            "支付方式<${qrcode.sourceType}> 不支持匿名支付") as ResponseEntity<Void>
-                } else {
-                    ResponseBodyBuilder.successEntity(apiResp.also {
-                        it.anonymous = qrcodeTransResp.isAnonymous
-                    }) as ResponseEntity<Void>
-                }
+                throw BadRequestError("系统或商户暂不支持当前的支付类型}")
             }
             else -> {
-                ResponseBodyBuilder.failEntity(apiResp,
-                        HttpStatus.INTERNAL_SERVER_ERROR.value(),
-                        "第三方身份错误,<${agentResp.agentMsg}") as ResponseEntity<Void>
+                throw BadRequestError("第三方身份错误,<${agentResp.agentMsg}")
             }
         }
     }
@@ -242,7 +234,7 @@
 //            }
 //        }
 //    }
-//
+
 //    override fun qrcodePayQuery(xTenantId: String, refno: String): ResponseEntity<Void> {
 //        return null
 //    }
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 7565c8c..bdd8bfe 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -50,8 +50,7 @@
 spring.redis.database=0
 ###################################################
 springfox.documentation.swagger.v2.path=/api-docs
-openapi.aPITitle.base-path=/payapi
-spring.jackson.date-format=com.supwisdom.dlpay.payapi.RFC3339DateFormat
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
 
 multi-tenant.header.key=X-TENANT-ID