From ce9956ad37b804048d689c7b64b788d52b439a40 Mon Sep 17 00:00:00 2001 From: zhengziru Date: Thu, 3 Sep 2026 16:14:32 +0800 Subject: [PATCH] server_commit --- src/main/java/io/v/nutz/MainLauncher.java | 10 ++ .../pay/bank/china/BankChinaWxPayService.java | 124 ++++++++++++++++ .../module/ChinaBankPayNotifyRecord.java | 107 ++++++++++++++ .../bank/china/pojo/RefundOrderResponse.java | 37 +++++ .../IChinaBankPayNotifyRecordService.java | 7 + .../ChinaBankPayNotifyRecordServiceImpl.java | 19 +++ .../controller/MemberPayRecordController.java | 132 ++++++++++++++++++ .../web/commons/proc/NutShiroProcessor.java | 2 +- .../school/ActivityApplyController.java | 22 +-- .../activity/school/ActivityApply.html | 24 ++-- 10 files changed, 460 insertions(+), 24 deletions(-) create mode 100644 src/main/java/io/v/nutz/pay/bank/china/module/ChinaBankPayNotifyRecord.java create mode 100644 src/main/java/io/v/nutz/pay/bank/china/pojo/RefundOrderResponse.java create mode 100644 src/main/java/io/v/nutz/pay/bank/china/service/IChinaBankPayNotifyRecordService.java create mode 100644 src/main/java/io/v/nutz/pay/bank/china/service/impl/ChinaBankPayNotifyRecordServiceImpl.java diff --git a/src/main/java/io/v/nutz/MainLauncher.java b/src/main/java/io/v/nutz/MainLauncher.java index 12361c2..ba6f49a 100644 --- a/src/main/java/io/v/nutz/MainLauncher.java +++ b/src/main/java/io/v/nutz/MainLauncher.java @@ -1,5 +1,8 @@ package io.v.nutz; +import cn.hutool.json.JSONUtil; +import io.v.nutz.pay.bank.china.BankChinaWxPayService; +import io.v.nutz.pay.bank.china.pojo.WxPayOrderQueryResponse; import io.v.nutz.sys.models.*; import io.v.nutz.zhgh.proposal.models.ProposalUndertake; import io.v.nutz.sys.services.SysTaskService; @@ -72,6 +75,9 @@ public class MainLauncher { @Inject private Dao dao; + @Inject + private BankChinaWxPayService bankChinaWxPayService; + public static void main(String[] args) throws Exception { NbApp nb = new NbApp().setArgs(args).setPrintProcDoc(true); nb.getAppContext().setMainPackage("io.v"); @@ -92,6 +98,10 @@ public class MainLauncher { init_task(); init_proposal_undertake(); ioc.get(Globals.class); + WxPayOrderQueryResponse queryResponse = bankChinaWxPayService.queryOrder("688695202608281105286524495205"); + log.info("中国银行交易查询结果:"+JSONUtil.toJsonStr(queryResponse)); + //bankChinaWxPayService.refundOrder("688695202608281105286524495205", 0.01, "127.0.0.1"); + } /** diff --git a/src/main/java/io/v/nutz/pay/bank/china/BankChinaWxPayService.java b/src/main/java/io/v/nutz/pay/bank/china/BankChinaWxPayService.java index df54811..476fa0b 100644 --- a/src/main/java/io/v/nutz/pay/bank/china/BankChinaWxPayService.java +++ b/src/main/java/io/v/nutz/pay/bank/china/BankChinaWxPayService.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; +import io.v.nutz.pay.bank.china.pojo.RefundOrderResponse; import io.v.nutz.pay.bank.china.pojo.WxAppPayRequestParams; import io.v.nutz.pay.bank.china.pojo.WxAppPayResponse; import io.v.nutz.pay.bank.china.pojo.WxPayOrderQueryResponse; @@ -13,6 +14,7 @@ import io.v.nutz.pay.bank.china.sign.BankPaySign; import io.v.nutz.pay.cache.ChinaBankOrderWaitPayCacheService; import io.v.nutz.pay.common.CommonConstants; import io.v.nutz.pay.enums.*; +import io.v.nutz.pay.util.BillNoUtil; import io.v.nutz.pay.util.XmlUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; @@ -49,6 +51,9 @@ public class BankChinaWxPayService { // 支付交易查询地址 private static final String APP_ORDER_QUERY_URL = "/PGWPortal/QueryOrderTrans.do"; + // 退款请求地址 + private static final String REFUND_ORDER_URL = "/PGWPortal/RefundOrder.do"; + @Inject private ChinaBankOrderWaitPayCacheService chinaBankOrderWaitPayCacheService; @@ -369,4 +374,123 @@ public class BankChinaWxPayService { .setUnionPaySeq(unionPaySeq) .setQrOvertimeFlag(qrOvertimeFlag); } + + /** + * 订单退款 + * + * @param orderNo 原支付订单的商户订单号 + * @param refundAmount 退款金额(元),格式:整数位前不补零,小数位补齐2位小数,不超过10位整数+1位小数点+2位小数 + * @param custIp 客户IP地址(选填) + * @return RefundOrderResponse + */ + public RefundOrderResponse refundOrder(String orderNo, Double refundAmount, String custIp) { + payProperties.load(); + this.checkConfigPayProperties(); + + // 商户退款交易流水号:商户号(merchantNo)后6位+商户按自己规则生成的退款交易流水号 + String mRefundSeq = payProperties.getMerchantNoAfterChar(6).concat(BillNoUtil.getTimeNo(24)); + // 退款币种固定 001(人民币) + String curCode = "001"; + // 退款金额格式化为2位小数 + String refundAmountStr = String.format("%.2f", refundAmount); + + // 签名串:商户号|商户退款交易流水号|退款币种|退款金额|商户订单号 + // 注意:与支付接口签名串保持一致,末尾不添加分隔符 + String businessSignData = payProperties.getMerchantNo() + "|" + + mRefundSeq + "|" + + curCode + "|" + + refundAmountStr + "|" + + orderNo; + log.info("中国银行退款签名原串:businessSignData={}", businessSignData); + String signData = BankPaySign.getInstance().getSinData( + payProperties.getSignKeyFile(), + payProperties.getSignkeyPassword(), + payProperties.getSignkeyPassword(), + businessSignData); + log.info("中国银行退款签名结果:signData={}", signData); + + List formParams = Collections.synchronizedList(new ArrayList<>()); + formParams.add(new BasicNameValuePair("merchantNo", payProperties.getMerchantNo())); + formParams.add(new BasicNameValuePair("mRefundSeq", mRefundSeq)); + formParams.add(new BasicNameValuePair("curCode", curCode)); + formParams.add(new BasicNameValuePair("refundAmount", refundAmountStr)); + formParams.add(new BasicNameValuePair("orderNo", orderNo)); + formParams.add(new BasicNameValuePair("signData", signData)); + if (StrUtil.isNotBlank(custIp)) { + formParams.add(new BasicNameValuePair("custIp", custIp)); + } + log.info("中国银行退款发送参数:{}", JSONObject.toJSONString(formParams)); + + try { + HttpClient httpClient = new DefaultHttpClient(); + HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8"); + String action = payProperties.getDomain() + REFUND_ORDER_URL; + log.info("中国银行退款请求地址:{}", action); + HttpPost post = new HttpPost(action); + post.setEntity(entity); + HttpResponse postRes = httpClient.execute(post); + HttpEntity entityResult = postRes.getEntity(); + String result = EntityUtils.toString(entityResult); + log.info("---------- BankChinaWxPayService.refundOrder receive message ----------"); + log.info("[result]=[" + result + "]"); + if (StrUtil.isBlank(result)) { + throw new RuntimeException("BankChinaWxPayService.refundOrder receive message result is empty"); + } + + Document resultDocument = XmlUtil.createDocument(result); + // 退款接口响应字段:dealStatus(处理状态1成功/其他失败), bodyFlag(有无业务体0有/1无), + // exception(异常码), returnActFlag(操作类型3退款) + String dealStatus = XmlUtil.getNodeText(resultDocument, "dealStatus"); + String bodyFlag = XmlUtil.getNodeText(resultDocument, "bodyFlag", ""); + String exception = XmlUtil.getNodeText(resultDocument, "exception", ""); + String returnActFlag = XmlUtil.getNodeText(resultDocument, "returnActFlag", ""); + log.info("中国银行退款响应头:dealStatus={}, bodyFlag={}, exception={}, returnActFlag={}", + dealStatus, bodyFlag, exception, returnActFlag); + + // 处理状态判断:dealStatus = "1" 视为请求级成功;非1或存在异常码时抛出 + if (StrUtil.isBlank(dealStatus) || !"1".equals(dealStatus)) { + String msg = "中国银行退款请求失败: dealStatus=" + dealStatus; + if (StrUtil.isNotBlank(exception)) { + msg = msg + ", exception=" + exception; + } + throw new RuntimeException(msg); + } + // bodyFlag=1 无业务体 + 存在异常码:仍然视为业务失败 + if ("1".equals(bodyFlag) && StrUtil.isNotBlank(exception)) { + throw new RuntimeException("中国银行退款业务失败, exception=" + exception); + } + + RefundOrderResponse response = new RefundOrderResponse(); + response.setHdlSts(dealStatus); + response.setRtnMsg(exception); + response.setBdFlg(bodyFlag); + + // bodyFlag=0 才有业务体节点可解析 + if ("0".equals(bodyFlag)) { + response = analysisRefundOrderResponseBodyXml(resultDocument); + response.setHdlSts(dealStatus); + response.setRtnMsg(exception); + response.setBdFlg(bodyFlag); + } + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("中国银行退款请求发起失败:{}", e.getMessage()); + throw new RuntimeException("中国银行退款请求发起失败:" + e.getMessage()); + } + } + + private RefundOrderResponse analysisRefundOrderResponseBodyXml(Document document) throws Exception { + RefundOrderResponse resp = new RefundOrderResponse(); + resp.setMerchantNo(XmlUtil.getNodeText(document, "merchantNo")); + resp.setOrderNo(XmlUtil.getNodeText(document, "orderNo")); + resp.setMRefundSeq(XmlUtil.getNodeText(document, "mRefundSeq")); + resp.setOrderStatus(XmlUtil.getNodeText(document, "orderStatus")); + resp.setRefundAmount(XmlUtil.getNodeText(document, "refundAmount")); + resp.setOrderSeq(XmlUtil.getNodeText(document, "orderSeq")); + resp.setBankTranSeq(XmlUtil.getNodeText(document, "bankTranSeq")); + resp.setUnionPaySeq(XmlUtil.getNodeText(document, "unionPaySeq")); + resp.setSignData(XmlUtil.getNodeText(document, "signData")); + return resp; + } } diff --git a/src/main/java/io/v/nutz/pay/bank/china/module/ChinaBankPayNotifyRecord.java b/src/main/java/io/v/nutz/pay/bank/china/module/ChinaBankPayNotifyRecord.java new file mode 100644 index 0000000..4e6fb78 --- /dev/null +++ b/src/main/java/io/v/nutz/pay/bank/china/module/ChinaBankPayNotifyRecord.java @@ -0,0 +1,107 @@ +package io.v.nutz.pay.bank.china.module; + +import lombok.Data; +import org.nutz.dao.entity.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +/** + * 中国银行支付通知记录 + */ +@Data +@Comment("中国银行支付通知记录") +@Table(value = "china_bank_pay_notify_record") +public class ChinaBankPayNotifyRecord implements Serializable { + + @Comment("主键ID") + @Column(value = "id") + @ColDefine(type = ColType.VARCHAR, width = 32) + @Prev(els = {@EL("uuid()")}) + private String id; + + @Comment("商户号") + @Column(value = "merchant_no") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String merchantNo; + + @Comment("商户订单号") + @Column(value = "order_no") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String orderNo; + + @Comment("订单序列号") + @Column(value = "order_seq") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String orderSeq; + + @Comment("卡类型") + @Column(value = "card_typ") + @ColDefine(type = ColType.VARCHAR, width = 16) + private String cardTyp; + + @Comment("支付时间(银行原始字符串 yyyyMMddHHmmss)") + @Column(value = "pay_time") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String payTime; + + @Comment("订单状态") + @Column(value = "order_status") + @ColDefine(type = ColType.VARCHAR, width = 16) + private String orderStatus; + + @Comment("支付金额(银行原始字符串)") + @Column(value = "pay_amount") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String payAmount; + + @Comment("订单IP") + @Column(value = "order_ip") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String orderIp; + + @Comment("订单引用") + @Column(value = "order_refer") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String orderRefer; + + @Comment("银行交易流水号") + @Column(value = "bank_tran_seq") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String bankTranSeq; + + @Comment("操作类型标志") + @Column(value = "return_act_flag") + @ColDefine(type = ColType.VARCHAR, width = 16) + private String returnActFlag; + + @Comment("手机号") + @Column(value = "phone_num") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String phoneNum; + + @Comment("银联流水号") + @Column(value = "union_pay_seq") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String unionPaySeq; + + @Comment("签名数据(银行回传 Base64)") + @Column(value = "sign_data") + @ColDefine(type = ColType.TEXT) + private String signData; + + @Comment("验签结果: 1=通过 0=失败 NULL=未验签") + @Column(value = "verify_result") + @ColDefine(type = ColType.INT) + private Integer verifyResult; + + @Comment("处理结果说明") + @Column(value = "handle_result") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String handleResult; + + @Comment("创建时间") + @Column(value = "create_time") + @ColDefine(type = ColType.TIMESTAMP) + private Date createTime; +} diff --git a/src/main/java/io/v/nutz/pay/bank/china/pojo/RefundOrderResponse.java b/src/main/java/io/v/nutz/pay/bank/china/pojo/RefundOrderResponse.java new file mode 100644 index 0000000..d0d20a6 --- /dev/null +++ b/src/main/java/io/v/nutz/pay/bank/china/pojo/RefundOrderResponse.java @@ -0,0 +1,37 @@ +package io.v.nutz.pay.bank.china.pojo; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class RefundOrderResponse implements Serializable { + + private String merchantNo; + + private String orderNo; + + private String mRefundSeq; + + private String orderStatus; + + private String refundAmount; + + private String orderSeq; + + private String bankTranSeq; + + private String unionPaySeq; + + private String hdlSts; + + private String rtnMsg; + + private String bdFlg; + + private String signData; +} diff --git a/src/main/java/io/v/nutz/pay/bank/china/service/IChinaBankPayNotifyRecordService.java b/src/main/java/io/v/nutz/pay/bank/china/service/IChinaBankPayNotifyRecordService.java new file mode 100644 index 0000000..d109143 --- /dev/null +++ b/src/main/java/io/v/nutz/pay/bank/china/service/IChinaBankPayNotifyRecordService.java @@ -0,0 +1,7 @@ +package io.v.nutz.pay.bank.china.service; + +import io.v.nutz.base.service.BaseService; +import io.v.nutz.pay.bank.china.module.ChinaBankPayNotifyRecord; + +public interface IChinaBankPayNotifyRecordService extends BaseService { +} diff --git a/src/main/java/io/v/nutz/pay/bank/china/service/impl/ChinaBankPayNotifyRecordServiceImpl.java b/src/main/java/io/v/nutz/pay/bank/china/service/impl/ChinaBankPayNotifyRecordServiceImpl.java new file mode 100644 index 0000000..50b0104 --- /dev/null +++ b/src/main/java/io/v/nutz/pay/bank/china/service/impl/ChinaBankPayNotifyRecordServiceImpl.java @@ -0,0 +1,19 @@ +package io.v.nutz.pay.bank.china.service.impl; + +import io.v.nutz.base.service.impl.BaseServiceImpl; +import io.v.nutz.pay.bank.china.module.ChinaBankPayNotifyRecord; +import io.v.nutz.pay.bank.china.service.IChinaBankPayNotifyRecordService; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +@Slf4j +@IocBean(args = {"refer:dao"}) +public class ChinaBankPayNotifyRecordServiceImpl + extends BaseServiceImpl + implements IChinaBankPayNotifyRecordService { + + public ChinaBankPayNotifyRecordServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/io/v/nutz/pay/record/controller/MemberPayRecordController.java b/src/main/java/io/v/nutz/pay/record/controller/MemberPayRecordController.java index b04c4b2..819eb07 100644 --- a/src/main/java/io/v/nutz/pay/record/controller/MemberPayRecordController.java +++ b/src/main/java/io/v/nutz/pay/record/controller/MemberPayRecordController.java @@ -1,13 +1,19 @@ package io.v.nutz.pay.record.controller; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.wizzer.framework.base.Result; import io.v.nutz.pay.annotations.Api; import io.v.nutz.pay.annotations.ApiOperation; +import io.v.nutz.pay.bank.china.BankChinaWxPayService; +import io.v.nutz.pay.bank.china.pojo.RefundOrderResponse; +import io.v.nutz.pay.bank.china.pojo.WxPayOrderQueryResponse; import io.v.nutz.pay.cache.ChinaBankOrderWaitPayCacheService; +import io.v.nutz.pay.common.CommonConstants; import io.v.nutz.pay.enums.ChannelTypeEnum; import io.v.nutz.pay.enums.MemberPayBusinessTypeEnum; +import io.v.nutz.pay.enums.MemberPayStatusEnum; import io.v.nutz.pay.enums.PayChannelEnum; import io.v.nutz.pay.form.PayRecordForm; import io.v.nutz.pay.pojo.LoginUser; @@ -15,6 +21,8 @@ import io.v.nutz.pay.record.module.MemberPayRecord; import io.v.nutz.pay.record.service.IMemberPayRecordService; import io.v.nutz.pay.util.AuthUtil; import io.v.nutz.pay.util.ServletUtil; +import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo; +import io.v.nutz.zhgh.memberCost.service.MemberPaymentService; import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -42,6 +50,12 @@ public class MemberPayRecordController { @Inject private ChinaBankOrderWaitPayCacheService chinaBankOrderWaitPayCacheService; + @Inject + private BankChinaWxPayService bankChinaWxPayService; + + @Inject + private MemberPaymentService memberPaymentService; + @Ok("json") @At("/get/by/code") @@ -107,4 +121,122 @@ public class MemberPayRecordController { chinaBankOrderWaitPayCacheService.delItem(payCode, 60 * 60 * 24); return Result.success(); } + + @At("/refund") + @Ok("json") + @ApiOperation("支付记录退款(调用银行退款接口)") + public Result refund(String goodsTradeCode, Double refundAmount, HttpServletRequest request) { + Assert.isTrue(StrUtil.isNotBlank(goodsTradeCode), "缺少商品交易单号"); + Assert.notNull(refundAmount, "缺少退款金额"); + Assert.isTrue(refundAmount > 0, "退款金额必须大于0"); + + // 查询支付记录 + MemberPayRecord record = memberPayRecordService.getByGoodsTradeCode(goodsTradeCode); + if (record == null) { + return Result.error("支付记录不存在"); + } + if (!MemberPayStatusEnum.SUCCESS.getCode().equals(record.getStatus())) { + return Result.error("支付记录状态不支持退款"); + } + if (record.getPayMoney() != null && refundAmount > record.getPayMoney()) { + return Result.error("退款金额不能大于支付金额"); + } + + LoginUser loginUser = AuthUtil.instance().getLoginUser(); + if (loginUser == null || StrUtil.isBlank(loginUser.getId())) { + throw new RuntimeException("用户登录失效,请重新登录"); + } + + // 终端IP + String deviceIp = ServletUtil.getIp(request); + + try { + RefundOrderResponse resp; + // 中国银行支付渠道 + if (PayChannelEnum.CHINA_BANK.getCode().equals(record.getPayChannel())) { + resp = bankChinaWxPayService.refundOrder(goodsTradeCode, refundAmount, deviceIp); + } else { + return Result.error("不支持该支付渠道退款"); + } + + // 更新支付记录状态为已退款 + record.setStatus(MemberPayStatusEnum.REFUND.getCode()); + record.setLastRefundTime(DateUtil.date()); + record.setRefundMoney(refundAmount); + record.setStatusReason("退款成功"); + memberPayRecordService.update(record); + + // 退款后重置会员缴费信息为未缴费: business_id 即 member_payment_info.id + if (MemberPayBusinessTypeEnum.UNION_PAYMENT.getCode().equals(record.getBusinessType()) + && StrUtil.isNotBlank(record.getBusinessId())) { + MemberPaymentInfo paymentInfo = memberPaymentService.fetch(record.getBusinessId()); + if (paymentInfo != null) { + paymentInfo.setPayment(false); + memberPaymentService.update(paymentInfo); + } + } + + return Result.success(resp); + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.getMessage()); + } + } + + @At("/query/order") + @Ok("json") + @ApiOperation("银行查询订单交易状态(PGWPortal/QueryOrderTrans.do)") + public Result queryOrderByBank(String goodsTradeCode) { + Assert.isTrue(StrUtil.isNotBlank(goodsTradeCode), "缺少商品交易单号"); + + // 查询本地支付记录,校验记录存在及渠道类型 + MemberPayRecord record = memberPayRecordService.getByGoodsTradeCode(goodsTradeCode); + if (record == null) { + return Result.error("支付记录不存在"); + } + if (!PayChannelEnum.CHINA_BANK.getCode().equals(record.getPayChannel())) { + return Result.error("不支持该支付渠道查询"); + } + + try { + // 调用银行查询接口 + WxPayOrderQueryResponse response = bankChinaWxPayService.queryOrder(goodsTradeCode); + + // 根据银行返回的交易状态同步更新本地支付记录 + // 仅在本地记录仍为待支付状态时才同步,避免通知已处理后重复累加 payMoney + Integer currentStatus = record.getStatus(); + boolean needSync = MemberPayStatusEnum.WAIT.getCode().equals(currentStatus); + + String tranStatus = response.getTranStatus(); + if (needSync && tranStatus != null + && (tranStatus.equals(CommonConstants.ONE.toString()) || tranStatus.equals(CommonConstants.TWO.toString()))) { + + if (tranStatus.equals(CommonConstants.ONE.toString())) { + // 支付成功 + Double payAmount = response.getTranAmount() != null + ? Double.valueOf(response.getTranAmount()) : record.getPayMoney(); + memberPayRecordService.paySuccess(goodsTradeCode, payAmount); + + // 同步更新会员缴费信息为已缴费 + if (MemberPayBusinessTypeEnum.UNION_PAYMENT.getCode().equals(record.getBusinessType()) + && StrUtil.isNotBlank(record.getBusinessId())) { + MemberPaymentInfo paymentInfo = memberPaymentService.fetch(record.getBusinessId()); + if (paymentInfo != null) { + paymentInfo.setPayment(true); + memberPaymentService.update(paymentInfo); + } + } + + } else { + // 支付失败 + memberPayRecordService.payFail(goodsTradeCode, "银行查询结果:支付失败"); + } + } + + return Result.success(response); + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.getMessage()); + } + } } diff --git a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java index 5d63dae..d7abf98 100644 --- a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java +++ b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java @@ -76,7 +76,7 @@ public class NutShiroProcessor extends AbstractProcessor { "/platform/qywechat/.*", "/platform/wechat/.*", "/platform/home/(500|403|404|UnknownAccountError|LockedAccountError)", - "/mobile/login", +// "/mobile/login", "/mobile/login/doLogin", "/platform/jsz/login", "/platform/activity/basic/scope/getScopeUser", diff --git a/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java b/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java index e78df84..6ce5f1f 100644 --- a/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java +++ b/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java @@ -273,7 +273,7 @@ public class ActivityApplyController { Sql applySql = Sqls.create(""" SELECT asa.* - + FROM activity_school_apply asa LEFT JOIN activity_school_team team ON asa.teamId = team.id @@ -308,7 +308,7 @@ public class ActivityApplyController { cndTeam.and("activityId", "=", activityId); List teamList = activitySchoolTeamService.dao().query(ActivitySchoolTeam.class, cndTeam.orderBy("CAST(SUBSTRING(name FROM 2 FOR LOCATE('队', name) - 2) AS UNSIGNED)", "ASC")); - if (activity.getApplyMultipleTeamsUnionIds().contains(Vi.getUnionId())) { + if (Lang.isNotEmpty(activity.getApplyMultipleTeamsUnionIds()) && activity.getApplyMultipleTeamsUnionIds().contains(Vi.getUnionId())) { result.put("team", teamList); } else { result.put("team", Lang.isNotEmpty(teamList) ? List.of(teamList.get(0)) : teamList); @@ -575,15 +575,15 @@ public class ActivityApplyController { public Object findUserOne(String id) { try { Sql sql = Sqls.create("SELECT\n" + - "\tu.id,u.username,u.unitid,\n" + - "\tu.loginname,\n" + - "\tu.sex,\n" + - "\tu.mobile,\n" + - "\tu.position,\n" + - "\tun.`name` unitname \n" + - "FROM\n" + - "\tsys_user u\n" + - "\tLEFT JOIN sys_unit un ON u.unitid = un.id Where u.id = @id").setParam("id", id); + "\tu.id,u.username,u.unitid,\n" + + "\tu.loginname,\n" + + "\tu.sex,\n" + + "\tu.mobile,\n" + + "\tu.position,\n" + + "\tun.`name` unitname \n" + + "FROM\n" + + "\tsys_user u\n" + + "\tLEFT JOIN sys_unit un ON u.unitid = un.id Where u.id = @id").setParam("id", id); return Result.success().addData(activitySchoolService.list(sql).get(0)); } catch (Exception e) { diff --git a/src/main/resources/views/platform/activity/school/ActivityApply.html b/src/main/resources/views/platform/activity/school/ActivityApply.html index 2e1d2ce..a610a95 100644 --- a/src/main/resources/views/platform/activity/school/ActivityApply.html +++ b/src/main/resources/views/platform/activity/school/ActivityApply.html @@ -331,18 +331,18 @@ layout("/layouts/platform.html"){