diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index fe41dd4..26c35db 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -5,8 +5,8 @@
 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
 # Postgresql settings
 spring.datasource.platform=postgresql
-spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/watermanager
-spring.datasource.username=watermanager
+spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/door
+spring.datasource.username=payapi
 spring.datasource.password=123456
 database.dbtype=postgresql
 # Redis settings
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
deleted file mode 100644
index 3b5bd5e..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ /dev/null
@@ -1,245 +0,0 @@
-package com.supwisdom.dlpay.api
-
-import com.google.gson.Gson
-import com.sun.jersey.api.client.Client
-import com.sun.jersey.api.client.ClientResponse
-import com.supwisdom.dlpay.api.bean.BaseResp
-import com.supwisdom.dlpay.api.bean.SupStatusRevResp
-import com.supwisdom.dlpay.api.bean.SupYktResp
-import com.supwisdom.dlpay.api.bean.WechatReqResp
-import com.supwisdom.dlpay.api.domain.TPersondtl
-import com.supwisdom.dlpay.api.domain.TShopdtl
-import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.Code
-
-class CallBackResp {
-    var retcode: String = "99"
-    var retmsg: String? = null
-    val data = mutableMapOf<String, String>()
-    fun add(key: String, value: String) {
-        this.data.plus(mapOf(key to value))
-    }
-}
-
-class CallService {
-
-    companion object {
-        fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
-            val code = CallBackResp()
-            val appid = config["appid"]
-            if (appid.isNullOrEmpty()) {
-                code.retcode = "1"
-                code.retmsg = "一卡通支付方式未启用或未配置"
-                return code
-            }
-
-            val appkey = config["appkey"]
-            val orderurl = config["orderurl"]
-
-            val params = hashMapOf<String, String?>()
-            params.put("partner_id", appid)
-            params.put("stuempno", stuempno)
-            params.put("tradeno", paydtl.refno)
-            params.put("tradename", paydtl.payinfo)
-            params.put("amount", MoneyUtil.YuanToFen(paydtl.amount).toString())
-            params.put("shopid", yktshopid)
-            params.put("devphyid", devphyid)
-            params.put("calcmanagefee", "T") //是否计算费率
-            params.put("timestamp", time)
-            params.put("sign_method", "HMAC");
-            params.put("limitflag", "off") //是否判断消费限额，on-判断；off-不判断。默认on（判断限额）。为空或不为off都是on；
-            var signstr = StringUtil.createLinkString(HmacUtil.paraFilter(params))
-            val sign = HmacUtil.HMACSHA1(signstr, appkey)
-            signstr = "$signstr&sign=$sign&sourcetype=food"
-            val c = Client.create()
-            c.setConnectTimeout(20000)
-            val r = c.resource(orderurl)
-            val respClient = r.post(ClientResponse::class.java, signstr)
-            if (200 == respClient.status) {
-                val ret = respClient.getEntity(String::class.java)
-                if (ret != null) {
-                    try {
-                        val gson = Gson()
-                        val result = gson.fromJson(ret, SupYktResp::class.java)
-                        if (result == null) {
-                            code.retcode = "1"
-                            code.retmsg = "返回内容为空"
-                            return code
-                        }
-                        if ("0" != result.retcode) {
-                            if ("30" == result.retcode) {
-                                if (result.other != null) {
-                                    try {
-                                        val supStatusRevResp = gson.fromJson(result.other,
-                                                SupStatusRevResp::class.java)
-                                        if (supStatusRevResp != null) {
-                                            //同流水号，同一笔已经支付完成的，不重复支付。
-                                            if (3 == supStatusRevResp.status
-                                                    && supStatusRevResp.revflag != null
-                                                    && !supStatusRevResp.revflag) {
-                                                code.retcode = "0"
-                                                code.retmsg = "成功"
-                                                return code
-                                            }
-                                        }
-                                    } catch (e: Exception) {
-                                        e.printStackTrace()
-                                    }
-                                }
-                            }
-                            code.retcode = "1"
-                            code.retmsg = "交易失败:" + result.retmsg
-                            return code
-                        }
-                        code.retcode = "0"
-                        code.retmsg = "成功"
-                        return code
-                    } catch (e: Exception) {
-                        e.printStackTrace()
-                    }
-                }
-            }
-            code.retcode = "1"
-            code.retmsg = "请求失败"
-            return code
-        }
-
-        fun callWechatPay(config: Map<String, String>, paydtl: TPersondtl, time: String, wechattype: String,
-                          realip: String?, qrcode: String?, openid: String?): BaseResp {
-            val code = BaseResp()
-            val appid = config["appid"]
-            if (appid.isNullOrEmpty()) {
-                code.retcode = "1"
-                code.retmsg = "微信支付方式未启用或未配置"
-                return code
-            }
-            val appkey = config["appkey"]
-            val orderurl = config["orderurl"]
-            val mchid = config["mchid"]
-            val wechatReqResp = WechatReqResp()
-            wechatReqResp.openid = openid
-            wechatReqResp.appid = appid
-            wechatReqResp.total_fee = MoneyUtil.YuanToFen(paydtl.amount)
-            wechatReqResp.body = paydtl.payinfo
-            wechatReqResp.key = appkey
-            wechatReqResp.mch_id = mchid
-            wechatReqResp.notify_url = config["notifyurl"] + "/notify/wechat"
-            wechatReqResp.out_trade_no = paydtl.refno
-            wechatReqResp.spbill_create_ip = realip
-            val c = Client.create()
-            c.setConnectTimeout(20000)
-            return when (wechattype) {
-                "qrcode" -> {
-                    code
-                }
-                "app" -> {
-                    wechatReqResp.trade_type = "APP"
-                    code
-                }
-                "mp" -> {
-                    wechatReqResp.trade_type = "JSAPI"
-                    wechatReqResp.generaSign()
-                    val xml = wechatReqResp.generaXML()
-                    val r = c.resource(orderurl)
-                    val respClient = r.post(ClientResponse::class.java, xml)
-                    if (200 == respClient.status) {
-                        try {
-                            val ret = respClient.getEntity(String::class.java)
-                            if (ret != null) {
-                                val eleMap = XmlUtils.parseXml(ret)
-                                val retcode = eleMap["return_code"]
-                                val result_code = eleMap["result_code"]
-                                val prepay_id = eleMap["prepay_id"]
-                                if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
-                                        && !result_code.isNullOrEmpty() && "SUCCESS" == result_code
-                                        && !prepay_id.isNullOrEmpty()) {
-                                    wechatReqResp.retcode = 0
-                                    wechatReqResp.retmsg = "初始化成功"
-                                    wechatReqResp.prepay_id = prepay_id
-                                    //TODO prepay_id 是否保存
-                                    wechatReqResp.timestamp = DateUtil.getNowSecond().toString()
-                                    wechatReqResp.nonce_str = RandomUtils.getRandomString(30)
-                                    wechatReqResp.generaJSAPISign()
-                                    val params = wechatReqResp.generaJSAPIParamters()
-                                    code.setCode(Code.SUCCESS)
-                                    code.data = params
-                                } else {
-                                    code.retcode = "1"
-                                    code.retmsg = eleMap["return_msg"]
-                                }
-                            } else {
-                                code.retcode = "1"
-                                code.retmsg = "微信支付请求失败"
-                            }
-                        } catch (e: Exception) {
-                            e.printStackTrace()
-                            code.retcode = "1"
-                            code.retmsg = "微信支付请求异常"
-                        }
-
-                    } else {
-                        code.retcode = "1"
-                        code.retmsg = "微信支付请求返回失败"
-                    }
-                    code
-                }
-                "h5" -> {
-                    wechatReqResp.trade_type = "MWEB"
-                    wechatReqResp.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + config["notifyurl"] + "\",\"wap_name\": \"${paydtl.payinfo}\"}}"
-                    val xml = wechatReqResp.generaXML()
-                    val r = c.resource(orderurl)
-                    val respClient = r.post(ClientResponse::class.java, xml)
-                    if (200 == respClient.status) {
-                        try {
-                            val ret = respClient.getEntity(String::class.java)
-                            if (ret != null) {
-                                val eleMap = XmlUtils.parseXml(ret)
-                                val retcode = eleMap["return_code"]
-                                val result_code = eleMap["result_code"]
-                                val prepay_id = eleMap["prepay_id"]
-                                val mweb_url = eleMap["mweb_url"]
-                                if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
-                                        && !result_code.isNullOrEmpty() && "SUCCESS" == result_code
-                                        && !prepay_id.isNullOrEmpty()) {
-                                    wechatReqResp.retcode = 0
-                                    wechatReqResp.retmsg = "初始化成功"
-                                    wechatReqResp.prepay_id = prepay_id
-                                    wechatReqResp.mweb_url = mweb_url
-                                    code.setCode(Code.SUCCESS)
-                                    code.data = mweb_url
-                                } else {
-                                    code.retcode = "1"
-                                    code.retmsg = eleMap["return_msg"]
-                                }
-                            } else {
-                                code.retcode = "1"
-                                code.retmsg = "微信支付请求失败"
-                            }
-                        } catch (e: Exception) {
-                            e.printStackTrace()
-                            code.retcode = "1"
-                            code.retmsg = "微信支付请求异常"
-                        }
-
-                    } else {
-                        code.retcode = "1"
-                        code.retmsg = "微信支付请求返回失败"
-                    }
-                    code
-                }
-                else -> {
-                    code.retcode = "1"
-                    code.retmsg = "未标识的类型：wechattype=$wechattype"
-                    code
-                }
-            }
-        }
-
-        fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
-            val resp = CallBackResp()
-            resp.retcode = "0"
-            // TODO: 代扣逻辑
-            return resp
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
deleted file mode 100644
index 4a8241d..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ /dev/null
@@ -1,516 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.AccountProxy
-import com.supwisdom.dlpay.api.CallService
-import com.supwisdom.dlpay.api.TransactionBuilder
-import com.supwisdom.dlpay.api.bean.*
-import com.supwisdom.dlpay.api.dao.TransactionMainDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.ConsumePayService
-import com.supwisdom.dlpay.api.service.TransactionService
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.*
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.security.core.Authentication
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/consume")
-class ConsumeController {
-    @Autowired
-    lateinit var accountUtilServcie: AccountUtilServcie
-    @Autowired
-    lateinit var userService: UserService
-    @Autowired
-    lateinit var systemUtilService: SystemUtilService
-    @Autowired
-    lateinit var consumePayService: ConsumePayService
-    @Autowired
-    lateinit var commonService: CommonService
-
-    @Autowired
-    lateinit var transactionMainDao: TransactionMainDao
-
-    @Autowired
-    lateinit var transactionService: TransactionService
-
-    /**
-     * 流水结果查询统一接口
-     * */
-    fun queryDtlResult(@RequestBody param: QueryDtlResultParam,
-                       request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val dtl = transactionMainDao.findByRefnoForUpdate(param.refno)
-                    ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号错误<${param.refno}>"))
-
-            val person = if (dtl.person) {
-                userService.findPersonByUserid(dtl.personDtl.userid)
-            } else {
-                null
-            }
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", dtl.refno)
-                    .data("amount", dtl.personDtl.amount)
-                    .data("paytype", dtl.personDtl.sourceType)
-                    .data("payinfo", dtl.personDtl.payinfo)
-                    .also {
-                        if (null != person) {
-                            it.data("name", person.name)
-                        }
-                    }
-                    .success("查询成功"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "查询错误"))
-        }
-    }
-
-    private fun consumeMealer(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
-                              builder: TransactionBuilder,
-                              feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
-        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
-                TradeDict.PAYTYPE_BALANCE)
-        val amount = feetype.amount / 100.0
-        when (feetypeConfig.crsubjno) {
-            shop.subjno -> {
-                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop),
-                        amount, feetypeConfig.summary)
-                        .shop().also {
-                            it.addAmount(amount)
-                        }
-            }
-            else -> {
-                val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno)
-                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(subject),
-                        amount, feetypeConfig.summary)
-            }
-        }
-
-    }
-
-    private fun consumeDiscount(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
-                                builder: TransactionBuilder,
-                                feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
-        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
-                TradeDict.PAYTYPE_BALANCE)
-        val amount = feetype.amount / 100.0
-        when (feetypeConfig.drsubjno) {
-            shop.subjno -> {
-                builder.addDebitCreditRecord(AccountProxy(shop), AccountProxy(person),
-                        amount, feetypeConfig.summary)
-            }
-            else -> {
-                val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno)
-                builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shop),
-                        amount, feetypeConfig.summary)
-            }
-        }
-    }
-
-    /**
-     * ============================================================================
-     *                           账户【余额支付】
-     * ============================================================================
-     * */
-    @PostMapping("/balance/pay")
-    fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
-                val account = accountUtilServcie.readAccount(person.userid)
-                val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
-
-                val builder = TransactionBuilder().apply {
-                    setTransInfo(param.transdate, param.transtime,
-                            TradeCode.TRANSCODE_BALANCE_PAY,
-                            TradeDict.PAYTYPE_BALANCE)
-                    setOutTransInfo(shopacc.shopaccno, param.billno)
-                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
-                    payinfo = "账户余额消费"
-                    description = "账户余额消费"
-                }.person(account).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                    opposite = AccountProxy(shopacc)
-                }.and().shop(shopacc).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                    opposite = AccountProxy(account)
-                }.and()
-
-                param.feelist?.forEach {
-                    when (it.feetype) {
-                        TradeDict.FEETYPE_CONSUME_MEALER -> {
-                            consumeMealer(param, builder, it, account, shopacc)
-                        }
-                        TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-                            consumeDiscount(param, builder, it, account, shopacc)
-                        }
-                        else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "支付费率清单不支持feetype<${it.feetype}>")
-                    }
-                }
-
-                val dtl = builder.init(transactionService)
-                transactionService.success(dtl.refno)
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.personDtl.amount)
-                        .success("交易成功"))
-            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
-
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-    /**
-     * ============================================================================
-     *                           市民卡【交易初始化】
-     * ============================================================================
-     * */
-    @PostMapping("/citizencard/payinit")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, authenticateAction: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
-
-                val account = accountUtilServcie.readAccount(person.userid)
-                val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
-                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
-                val transaction = TransactionBuilder().apply {
-                    setTransInfo(param.transdate, param.transtime,
-                            TradeCode.TRANSCODE_CITIZENCARD_PAY,
-                            TradeDict.PAYTYPE_CITIZEN_CARD)
-                    setOutTransInfo(shopacc.shopaccno, param.billno)
-                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
-                    payinfo = "市民卡代扣消费"
-                    description = "市民卡代扣消费"
-                }.person(account).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                    opposite = AccountProxy(shopacc)
-                }.and().shop(shopacc).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                    opposite = AccountProxy(account)
-                }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account),
-                        param.amount / 100.0, "市民卡代扣消费")
-                        .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
-                                param.amount / 100.0, "市民卡代扣消费")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                //fixme: 科目 -> 商户 与个人无关
-                                val feeconfig = accountUtilServcie.readFeetype(it.feetype,
-                                        TradeDict.PAYTYPE_CITIZEN_CARD)
-                                val subj = accountUtilServcie.readSubject(feeconfig.drsubjno)
-                                builder.addDebitCreditRecord(AccountProxy(subj), AccountProxy(shopacc),
-                                        it.amount / 100.0, feeconfig.summary)
-
-                            }
-                        }.init(transactionService)
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", transaction.refno)
-                        .data("amount", transaction.shopDtl.amount)
-                        .success("交易初始化成功"))
-            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
-
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    /**
-     * ============================================================================
-     *                           市民卡【交易确认】
-     * ============================================================================
-     * */
-    @PostMapping("/citizencard/payfinish")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val code = transactionService.wip(param.refno).let {
-                CallService.CallCitizenCardPay(
-                        consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, it.shopDtl.shopaccno),
-                        it.shopDtl)
-            }
-            if (code.retcode == "0") {
-                transactionService.success(param.refno).let {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("refno", it.refno)
-                            .data("billno", it.outTradeNo)
-                            .success("交易确认成功"))
-                }
-            } else {
-                transactionService.fail(param.refno).let {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-                }
-            }
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-    /**
-     * ============================================================================
-     *                           一卡通支付【交易初始化】
-     * ============================================================================
-     * */
-    @PostMapping("/ykt/payinit")
-    fun yktPayInit(@RequestBody param: YktCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-//
-//            val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册，可能匿名?
-//            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) {
-//                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                        .chooseTradetype(Tradetype.CONSUME) //消费
-//                        .also {
-//                            if (null != person) it.setOwner(person)
-//                        }
-//                        .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
-//                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-//                        .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
-//                        .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
-//                                AccountHolder.shop(param.shopaccno),
-//                                param.amount / 100.0, "一卡通支付")
-//                        .also { builder ->
-//                            param.feelist?.forEach {
-//                                //fixme: 科目 -> 商户 与个人无关
-//                                builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
-//                                        .with(AccountHolder.shop(param.shopaccno))
-//                                        .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
-//                                        , it.amount / 100.0)
-//                            }
-//                        }
-//                        .addExtendParam("stuempno", param.stuempno)
-//                        .addExtendParam("yktshopid", param.yktshopid ?: "")
-//                        .addExtendParam("devphyid", param.devphyid ?: "")
-//                        //.addExtendParam(param.extendmap)  //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
-//                        .init(personBalancePayService)
-//
-//                return ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .data("refno", dtl.refno)
-//                        .data("amount", dtl.amount)
-//                        .success("交易初始化成功"))
-//
-//            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-    /**
-     * ============================================================================
-     *                           一卡通支付【交易确认】
-     * ============================================================================
-     * */
-    @PostMapping("/ykt/payfinish")
-    fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-//
-//            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                    .setRefno(param.refno)
-//                    .wip(personBalancePayService)
-//            val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
-//            val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
-//                    dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
-//            if (code.retcode == "0") {
-//                dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                        .setRefno(param.refno)
-//                        .addResult(code.data)
-//                        .success(personBalancePayService) //流水置成功
-//
-//                return ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .data("refno", dtl.refno)
-//                        .data("billno", dtl.outtradeno)
-//                        .success())
-//            } else {
-//                PersonTransBuilder.newBuilder(accountUtilServcie)
-//                        .setRefno(param.refno)
-//                        .addResult("errmsg", code.retmsg!!)
-//                        .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-//
-//                return ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-//            }
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-// ============================================== //
-//
-//    @GetMapping("/account/payinit")
-//    fun accountPayInit(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
-//        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                .setTransDatetime("20190411", "112311")
-//                .enableOverdraft(false)
-//                .addDetail(AccountHolder.person(userid),
-//                        AccountHolder.shop("12323"),
-//                        amount / 100.0, "")
-//                .addDetail(AccountHolder.person(userid), AccountHolder.transType(301),
-//                        manageFee / 100.0, "")
-//                .done(personBalancePayService, false)
-//
-//        return ResponseEntity.ok(dtl)
-//    }
-//
-//    @GetMapping("/account/payfinish")
-//    fun accountPayFinish(refno: String): ResponseEntity<Any> {
-//        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
-//        return ResponseEntity.ok(dtl)
-//    }
-
-
-//
-//    /**
-//     * 微信支付
-//     * wechattype
-//     * qrcode-扫微信二维码支付
-//     * app-原生app微信支付
-//     * mp-微信公众号支付
-//     * h5-微信h5支付
-//     *
-//     * */
-//    @PostMapping("/wechat/payinit")
-//    fun wechatPayInit(userid: String, amount: Int, manageFee: Int,
-//                      stuempno: String, shopid: String, transdate: String, transtime: String,
-//                      outtradeno: String, payinfo: String, feetype: String,
-//                      wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity<Any> {
-//        return try {
-//            val paytype = paytypeService.getBySourceType(PaytypeUtil.WECHAT)
-//            if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(1, "支付方式未开启"))
-//            }
-//            val person = userService.findByThirdUniqueIdenty(stuempno)
-//            val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                    .setTransDatetime(transdate, transtime)
-//                    .selectPaytype(PaytypeUtil.WECHAT, payinfo)
-//                    .setOuttradeno(outtradeno)
-//                    .also {
-//                        if (null != person) it.setOwner(person)
-//                    }
-//                    .tryLock(true)
-//                    .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付")
-//                    .chooseTradetype(Tradetype.CONSUME)
-//                    .also {
-//                        when (feetype) {
-//                            TradeDict.FEETYPE_CONSUME_MEALER -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        amount / 100.0, "微信支付")
-//                                        .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE)
-//                                                .with(AccountHolder.shop(shopid)),
-//                                                manageFee / 100.0)
-//                            }
-//                            TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        (amount - manageFee) / 100.0, "微信支付")
-//                                        .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT),
-//                                                AccountHolder.shop(shopid),
-//                                                manageFee / 100.0, "优惠折扣")
-//                            }
-//                            else -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        amount / 100.0, "微信支付")
-//                            }
-//                        }
-//                    }.done(personBalancePayService, false)
-//            val code = CallService.callWechatPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT),
-//                    dtl, DateUtil.getNow(), wechattype, realip, qrcode, openid)
-//            if (code.retcode == "0") {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .data("refno", dtl.refno)
-//                        .success())
-//            } else {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
-//            }
-//        } catch (e: TransactionException) {
-//            ResponseEntity.ok(ResponseBodyBuilder.create()
-//                    .transException(e, "交易初始化异常"))
-//        }
-//    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
deleted file mode 100644
index d57c96d..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.SourceTypeService
-import com.supwisdom.dlpay.api.service.TransactionService
-import com.supwisdom.dlpay.framework.util.MD5
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.util.PaytypeUtil
-import org.dom4j.io.SAXReader
-import org.slf4j.LoggerFactory
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.util.StringUtils
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.ResponseBody
-import org.springframework.web.bind.annotation.RestController
-import java.util.*
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-/**
- * Created by shuwei on 2019/4/22.
- */
-@RestController
-@RequestMapping("/api/notify")
-class NotifyController {
-    private val logger = LoggerFactory.getLogger(NotifyController::class.java)
-    @Autowired
-    lateinit var paytypeService: SourceTypeService
-    @Autowired
-    lateinit var accountUtilServcie: AccountUtilServcie
-
-    @Autowired
-    lateinit var transactionService: TransactionService
-
-    @RequestMapping(value = ["/wechat"])
-    @ResponseBody
-    fun index(@PathVariable schema: String, request: HttpServletRequest,
-              response: HttpServletResponse): String {
-        try {
-            // 解析结果存储在HashMap
-            var map: MutableMap<String, String> = HashMap()
-            val inputStream = request.inputStream
-            // 读取输入流
-            val reader = SAXReader()
-            val document = reader.read(inputStream)
-            // 得到xml根元素
-            val root = document.rootElement
-            // 得到根元素的所有子节点
-            val elementList = root.elements()
-            // 遍历所有子节点
-            for (e in elementList) {
-                map[e.name] = e.text
-                logger.error("*************" + e.name + "=" + e.text + "************************")
-            }
-            // 释放资源
-            inputStream.close()
-
-            val sign = map["sign"]
-            if (StringUtils.isEmpty(sign)) {
-                logger.error("签名错误")
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
-            }
-            map = StringUtil.paraFilter(map)
-            //TODO 校验签名
-            var signStr = StringUtil.createLinkString(map)
-            val config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT)
-            if (config["appkey"].isNullOrEmpty()) {
-                logger.error("签名错误")
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
-            }
-            val key = config["appkey"]
-            signStr += "&key=$key"
-            val signRet = MD5.encodeByMD5(signStr)
-            logger.error("*******signStr=$signStr")
-            if (!signRet.equals(sign, ignoreCase = true)) {
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>"
-            }
-            logger.error("*******signRet=$signRet,sign=$sign*****************")
-            val return_code = map["return_code"]
-            val result_code = map["result_code"]
-            val out_trade_no = map["out_trade_no"]
-            if (out_trade_no == null || StringUtils.isEmpty(out_trade_no)) {
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单信息错误]]></return_msg></xml>"
-            }
-            if (!StringUtils.isEmpty(return_code) && "SUCCESS" == return_code
-                    && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
-                //map.get("transaction_id") 第三方流水号
-                transactionService.success(out_trade_no)
-            }
-            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
-        } catch (e: Exception) {
-            e.printStackTrace()
-            logger.error("------------step7----------------" + e.message)
-            return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[解析失败]]></return_msg></xml>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
deleted file mode 100644
index 71aab56..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
-import java.net.URLDecoder
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/user")
-class UserAPIController {
-    @Autowired
-    private lateinit var useService: UserService
-    @Autowired
-    private lateinit var commonService: CommonService
-
-    @PostMapping("/open")
-    fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-
-            if (!param.checkParam() || !param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByThirdUniqueIdenty(param.uid).let {
-                if (null != it) {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.REGISTER_USER_EXIST, "该用户唯一号已经注册"))
-                }
-
-                param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) }  //解码
-                useService.registerUser(param).let {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("userid", it.userid)
-                            .data("uid", param.uid)
-                            .success())
-                }
-            }
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/query")
-    fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let {
-                if (null != it) {
-                    val account = useService.findAccountByUserid(it.userid, null)
-                    val pointacc = useService.findPointsAccountByUserid(it.userid)
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("userid", it.userid)
-                            .data("name", it.name)
-                            .data("idtype", it.idtype)
-                            .data("idno", it.idno)
-                            .data("mobile", it.mobile)
-                            .data("email", it.email)
-                            .data("status", it.status)
-                            .data("balance", account.let {
-                                if (null == it) {
-                                    0.0
-                                } else {
-                                    it.availbal
-                                }
-                            }) //账户余额
-                            .data("points", pointacc.let {
-                                if (null == it) {
-                                    0
-                                } else {
-                                    it.points
-                                }
-                            }) //积分
-                            .success())
-                }
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-            }
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/modify")
-    fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid)?.let {
-                param.name = param.name?.let { URLDecoder.decode(param.name, Charsets.UTF_8.toString()) } //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
-                if (useService.modifyUserInfo(it, param)) {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .success("修改成功"))
-                } else {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "账户信息修改失败"))
-                }
-            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt
deleted file mode 100644
index e14f947..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.supwisdom.dlpay.api.repositories
-
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPersondtl
-import com.supwisdom.dlpay.api.domain.TShopdtl
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import org.springframework.stereotype.Repository
-import org.springframework.transaction.annotation.Transactional
-import javax.persistence.EntityManager
-import javax.persistence.PersistenceContext
-
-@Repository
-@Transactional
-class TAccountRepositoryImpl : TAccountRepository {
-
-    @PersistenceContext
-    private lateinit var entityManager: EntityManager
-
-    override fun recalcAccountBalance(accno: String, avaibal: Double, amount: Double, overdraft: Boolean): Int {
-        val account = entityManager.find(TAccount::class.java, accno) ?: return 0
-        if (avaibal.compareTo(account.availbal!!) != 0) {
-            throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY,
-                    "账户余额已被更新")
-        }
-
-        return entityManager.createQuery("update TAccount a set a.availbal=a.availbal+?1, a.balance=a.balance+?1 " +
-                "where a.accno=?2 and a.availbal=?3")?.run {
-            setParameter(1, amount)
-            setParameter(2, accno)
-            setParameter(3, avaibal)
-            executeUpdate()
-        } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "更新个人账户余额错误")
-    }
-
-    override fun recalcAccountBalance(account: TAccount, amount: Double, overdraft: Boolean): Int {
-        return recalcAccountBalance(account.accno, account.availbal, amount, overdraft)
-    }
-
-    override fun recalcAccountBalance(dtl: TPersondtl, amount: Double, overdraft: Boolean): Int {
-        return entityManager.find(TAccount::class.java, dtl.accountNo)?.let {
-            recalcAccountBalance(it, amount, overdraft).also { count ->
-                if (count == 1) {
-                    dtl.befbal = it.availbal
-                }
-            }
-        } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
-                "交易流水<${dtl.refno}>未找到指定个人账户")
-    }
-}
-
-@Repository
-@Transactional
-class ShopaccRepositoryImpl : TShopaccRepository {
-
-    @PersistenceContext
-    private lateinit var entityManager: EntityManager
-
-    override fun recalcShopBalance(dtl: TShopdtl, amount: Double, overdraft: Boolean): Int {
-        val shopacc = entityManager.find(TShopacc::class.java, dtl.shopaccno)
-                ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
-                        "交易流水<${dtl.refno}>商户账户不存在")
-
-        return entityManager.createQuery("update TShopacc c set c.balance=c.balance+?1" +
-                " where c.shopaccno=?2 and c.balance=?3")?.run {
-            setParameter(1, amount)
-            setParameter(2, dtl.shopaccno)
-            setParameter(3, shopacc.balance)
-            executeUpdate()
-        } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
-                "交易流水<${dtl.refno}>未找到指定商户账户")
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
deleted file mode 100644
index fa30ada..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.PersonDao
-import com.supwisdom.dlpay.api.dao.PersonIdentityDao
-import com.supwisdom.dlpay.api.dao.PointsAccountDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.util.*
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-@Service
-class UserServiceImpl : UserService {
-    @Autowired
-    private lateinit var personDao: PersonDao
-    @Autowired
-    private lateinit var accountDao: AccountDao
-    @Autowired
-    private lateinit var personIdentityDao: PersonIdentityDao
-    @Autowired
-    private lateinit var pointsAccountDao: PointsAccountDao
-    @Autowired
-    private lateinit var systemUtilService: SystemUtilService
-
-    override fun registerUser(param: OpenUserParam): TPerson {
-        var person = personDao.findByIdentity(param.idtype, param.idno)
-        if (null != person && param.name != person.name)
-            throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "证件指定用户与请求的用户名不匹配")
-
-        val systemdatetime = systemUtilService.sysdatetime
-        if (null == person) {
-            person = personDao.save(TPerson().apply {
-                name = param.name
-                sex = param.sex
-                status = TradeDict.STATUS_NORMAL
-                idtype = param.idtype
-                idno = param.idno
-                email = param.email
-                tel = param.tel
-                mobile = param.mobile
-                addr = param.address
-                zipcode = param.zipcode
-                lastsaved = systemdatetime.hostdatetime
-            })
-        }
-
-        if (accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT) == null) {
-            //开户
-            TAccount().apply {
-                accname = person.name
-                subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
-                userid = person.userid
-                status = person.status
-                balance = 0.0
-                availbal = 0.0
-                frozebal = 0.0
-                lowfreeFlag = false
-                lowfreeLimit = lowfreeLimit
-                daylimit = daylimit
-                maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
-                lasttransdate = systemdatetime.hostdate
-                lastdayTransamt = 0.0
-                lastdayDpsamt = 0.0
-                opendate = systemdatetime.hostdate
-                tac = this.generateTac()
-                accountDao.save(this)
-            }
-        }
-        personIdentityDao.save(TPersonIdentity().apply {
-            thirdUid = param.uid
-            this.person = person
-            status = person.status
-            lossflag = 0
-            lockflag = 0
-            createtime = systemdatetime.hostdatetime
-        }) //保存绑定关系
-
-        return person
-    }
-
-    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? {
-        return personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
-    }
-
-    override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? {
-        return if (!StringUtil.isEmpty(userid)) {
-            personDao.findByUserid(userid)
-        } else {
-            personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
-        }
-    }
-
-    override fun modifyUserInfo(person: TPerson, param: ModifyUserParam): Boolean {
-        if (!StringUtil.isEmpty(param.name) && param.name != person.name) {
-            person.name = param.name
-            accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT)?.let {
-                it.accname = param.name
-                accountDao.save(it)
-            }
-        }
-        if (!StringUtil.isEmpty(param.sex)) person.sex = param.sex
-        if (!StringUtil.isEmpty(param.idno)) {
-            person.idtype = param.idtype
-            person.idno = param.idno
-        }
-        if (!StringUtil.isEmpty(param.mobile)) person.mobile = param.mobile
-        if (!StringUtil.isEmpty(param.tel)) person.tel = param.tel
-        if (!StringUtil.isEmpty(param.email)) person.email = param.email
-        if (!StringUtil.isEmpty(param.address)) person.addr = param.address
-        if (!StringUtil.isEmpty(param.zipcode)) person.zipcode = param.zipcode
-        personDao.save(person)
-        return true
-    }
-
-    override fun findPersonByUserid(userid: String): TPerson? {
-        return personDao.findByUserid(userid)
-    }
-
-    override fun findAccountByUserid(userid: String, subjno: String?): TAccount? {
-        return if (!StringUtil.isEmpty(subjno)) {
-            accountDao.findByUseridAndSubjno(userid, subjno)
-        } else {
-            accountDao.findByUseridAndSubjno(userid, Subject.SUBJNO_PERSONAL_DEPOSIT)
-        }
-    }
-
-    override fun findPointsAccountByUserid(userid: String): TPointsAccount? {
-        return pointsAccountDao.findByUserid(userid)
-    }
-
-    override fun findPersonIdentity(thirdUniqueIdenty: String): TPersonIdentity? {
-        return personIdentityDao.getByThirdUid(thirdUniqueIdenty)
-    }
-
-    override fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson {
-        personIdentityDao.getByThirdUid(thirdUniqueIdenty).let {
-            if (null != it) {
-                if (TradeDict.STATUS_NORMAL != it.status) {
-                    throw TransactionProcessException(TradeErrorCode.PERSON_STATUS_ERROR, "账户状态异常")
-                }
-                if (1 == it.lossflag) {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "账户已挂失")
-                }
-                if (1 == it.lockflag) {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "账户已冻结")
-                }
-
-                if (null != it.person) {
-                    return it.person
-                } else {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
-                }
-            }
-
-            throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
deleted file mode 100644
index c4d9b20..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-interface UserService {
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun registerUser(param: OpenUserParam): TPerson
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun modifyUserInfo(person:TPerson,param: ModifyUserParam):Boolean
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonByUserid(userid: String): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findAccountByUserid(userid: String, subjno:String?): TAccount?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPointsAccountByUserid(userid: String): TPointsAccount?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonIdentity(thirdUniqueIdenty: String):TPersonIdentity?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson
-
-}
\ No newline at end of file
