From b20f26e60c7565709000d69db1d3d8f4d093a814 Mon Sep 17 00:00:00 2001 From: Xia Kaixiang Date: Wed, 4 Dec 2019 09:52:41 +0800 Subject: [PATCH] =?utf8?q?=E7=8E=B0=E5=9C=BA=E9=9C=80=E6=B1=82=E4=BF=AE?= =?utf8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../com/supwisdom/dlpay/api/dao/CardDao.java | 8 + .../supwisdom/dlpay/api/domain/TAccount.java | 2 +- .../dlpay/framework/util/Signature.java | 2 +- .../dlpay/framework/util/StringUtil.java | 51 +++ .../system/bean/CitizenCardShowBean.java | 9 + .../system/controller/UserController.java | 104 +++++- .../dlpay/system/service/UserDataService.java | 18 +- .../service/impl/UserDataServiceImpl.java | 346 +++++++++++++++++- .../api/service/impl/card_service_impl.kt | 16 + .../api/service/impl/shop_service_impl.kt | 5 +- ...transaction_reconciliation_service_impl.kt | 2 +- .../service/impl/framework_service_impl.kt | 2 +- payapi/src/main/resources/data.sql | 18 +- .../templates/system/user/addcard.html | 175 +++++++++ .../resources/templates/system/user/card.html | 85 ++++- .../templates/system/user/updatecard.html | 208 +++++++++++ 16 files changed, 1002 insertions(+), 49 deletions(-) create mode 100644 payapi/src/main/resources/templates/system/user/addcard.html create mode 100644 payapi/src/main/resources/templates/system/user/updatecard.html diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java index 7781be65..4b3ace37 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java @@ -24,4 +24,12 @@ public interface CardDao extends JpaRepository { @Query("from TCard t where cardtype='citizencard' and t.lastsaved>?1 and t.lastsaved<=?2 ") List findCitizencardByLastsaved(String startdate, String enddate); + + @Query("from TCard t where t.cardtype='citizencard' and t.cardphyid=?1 order by t.cardno") + List findCitizencardByCardphyid(String cardphyid); + + @Query("from TCard t where t.cardtype='citizencard' and t.cardphyid=?1 and t.id<>?2 order by t.cardno") + List findCitizencardByCardphyidWithoutOldId(String cardphyid, String oldId); + + TCard getById(String id); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java index 150f0cdd..56e0caed 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java @@ -264,7 +264,7 @@ public class TAccount implements Serializable { + MoneyUtil.YuanToFen(this.availbal) + MoneyUtil.YuanToFen(this.balance) + MoneyUtil.YuanToFen(this.frozebal); - System.out.println("accno="+this.accno+",data="+data); +// System.out.println("accno="+this.accno+",data="+data); return Signature.generateTac(this.accno, data); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java index 184130f1..a0173a01 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java @@ -16,7 +16,7 @@ public class Signature { if (tenant == null) { throw new IllegalArgumentException("TenantID 未定义"); } - System.out.println("factor="+factor+",data="+data+",tenant="+tenant); +// System.out.println("factor="+factor+",data="+data+",tenant="+tenant); return HMACUtil.sha256HMAC(deliveryKey(tenant, factor), data).substring(0, 24); } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java index 628137b6..adc71b53 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java @@ -221,4 +221,55 @@ public class StringUtil { } return false; } + + public static boolean isNumber(String inputStr) { + char[] ch = inputStr.toCharArray(); + for (int i = 0; i < ch.length; i++) { + if ((ch[i] < '0') || (ch[i] > '9')) { + return false; + } + } + return true; + } + + public static boolean isCardphyid(String str) { + if (null != str && str.matches("^[A-F0-9]+$")) { + return true; + } + return false; + } + + private static char getBankCardCheckCode(String nonCheckCodeBankCard) { + if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0 || !nonCheckCodeBankCard.matches("\\d+")) { + //如果传的不是数字返回N + return 'N'; + } + char[] chs = nonCheckCodeBankCard.trim().toCharArray(); + int luhmSum = 0; + for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) { + int k = chs[i] - '0'; + if (j % 2 == 0) { + k *= 2; + k = k / 10 + k % 10; + } + luhmSum += k; + } + return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0'); + } + + /** + * 判断是否是银行卡号 + * */ + public static boolean isBankcardno(String bankCard) { + if (bankCard.length() < 15 || bankCard.length() > 19) { + return false; + } + char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1)); + if (bit == 'N') { + return false; + } + return bankCard.charAt(bankCard.length() - 1) == bit; + } + + } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java index b5c095d4..5f4961b8 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java @@ -17,6 +17,7 @@ public class CitizenCardShowBean { private String idno; private String mobile; private String email; + private String sex; public String getCid() { return cid; @@ -145,4 +146,12 @@ public class CitizenCardShowBean { public void setEmail(String email) { this.email = email; } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java index fe353a1f..eb36de9a 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java @@ -3,27 +3,22 @@ package com.supwisdom.dlpay.system.controller; import com.supwisdom.dlpay.api.bean.JsonResult; 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.domain.TOperator; -import com.supwisdom.dlpay.framework.util.Dictionary; -import com.supwisdom.dlpay.framework.util.PageResult; -import com.supwisdom.dlpay.framework.util.StringUtil; -import com.supwisdom.dlpay.framework.util.WebConstant; +import com.supwisdom.dlpay.framework.util.*; import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean; import com.supwisdom.dlpay.system.bean.CitizenCardShowBean; -import com.supwisdom.dlpay.system.bean.IdTypeBean; import com.supwisdom.dlpay.system.bean.PersonParamBean; import com.supwisdom.dlpay.system.service.DictionaryProxy; import com.supwisdom.dlpay.system.service.UserDataService; +import com.supwisdom.dlpay.util.WebCheckException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; @Controller public class UserController { @@ -177,7 +172,7 @@ public class UserController { @GetMapping("/user/cardlist") @PreAuthorize("hasPermission('/user/card','')") @ResponseBody - public PageResult getBusinessDataList(@RequestParam("page") Integer pageNo, + public PageResult getCitizenCardList(@RequestParam("page") Integer pageNo, @RequestParam("limit") Integer pageSize, @RequestParam(value = "cardno", required = false) String cardno, @RequestParam(value = "cardphyid", required = false) String cardphyid, @@ -194,4 +189,93 @@ public class UserController { return new PageResult<>(99, "系统查询错误"); } } + + @GetMapping("/user/load4addcard") + @PreAuthorize("hasPermission('/user/load4addcard','')") + public String addCitizenCard() { + return "system/user/addcard"; + } + + @PostMapping("/user/cardadd") + @PreAuthorize("hasPermission('/user/cardadd','')") + @ResponseBody + public JsonResult addCitizencard(@RequestParam(value = "cardno", required = false) String cardno, + @RequestParam(value = "cardphyid", required = false) String cardphyid, + @RequestParam(value = "expiredate", required = false) String expiredate, + @RequestParam(value = "cardstatus", required = false) String cardstatus, + @RequestParam(value = "bankcardno", required = false) String bankcardno, + @RequestParam(value = "signstatus", required = false) String signstatus, + @RequestParam(value = "username", required = false) String username, + @RequestParam(value = "sex", required = false) String sex, + @RequestParam(value = "idtype", required = false) String idtype, + @RequestParam(value = "idno", required = false) String idno, + @RequestParam(value = "mobile", required = false) String mobile, + @RequestParam(value = "email", required = false) String email) { + try { + if (userDataService.doSaveNewCitizenCard(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) { + return JsonResult.ok("新增成功!"); + } else { + return JsonResult.error("新增失败!"); + } + } catch (WebCheckException wce) { + return JsonResult.error(wce.getMessage()); + } catch (Exception e) { + return dealViolationException(e, "新增异常!!"); + } + } + + private JsonResult dealViolationException(Exception e, String defaultErrmsg) { + String errmsg = ""; + if (e instanceof ConstraintViolationException) { + ConstraintViolationException cve = (ConstraintViolationException) e; + if (null != cve.getConstraintViolations()) { + for (ConstraintViolation v : cve.getConstraintViolations()) { + errmsg += v.getMessage() + " "; + } + } + } + if (!StringUtil.isEmpty(errmsg)) { + return JsonResult.error(errmsg); + } else { + e.printStackTrace(); + return JsonResult.error(defaultErrmsg); + } + } + + @GetMapping("/user/load4modifycard") + @PreAuthorize("hasPermission('/user/load4modifycard','')") + public String load4UpdateCitizenCard() { + return "system/user/updatecard"; + } + + @PostMapping("/user/cardupdate") + @PreAuthorize("hasPermission('/user/cardupdate','')") + @ResponseBody + public JsonResult addCitizencard(@RequestParam(value = "cid") String cid, + @RequestParam(value = "bkid") String bkid, + @RequestParam(value = "cardno", required = false) String cardno, + @RequestParam(value = "cardphyid", required = false) String cardphyid, + @RequestParam(value = "expiredate", required = false) String expiredate, + @RequestParam(value = "cardstatus", required = false) String cardstatus, + @RequestParam(value = "bankcardno", required = false) String bankcardno, + @RequestParam(value = "signstatus", required = false) String signstatus, + @RequestParam(value = "username", required = false) String username, + @RequestParam(value = "sex", required = false) String sex, + @RequestParam(value = "idtype", required = false) String idtype, + @RequestParam(value = "idno", required = false) String idno, + @RequestParam(value = "mobile", required = false) String mobile, + @RequestParam(value = "email", required = false) String email) { + try { + if (userDataService.doUpdateCitizenCard(cid, bkid, cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) { + return JsonResult.ok("修改成功!"); + } else { + return JsonResult.error("修改失败!"); + } + } catch (WebCheckException wce) { + return JsonResult.error(wce.getMessage()); + } catch (Exception e) { + return dealViolationException(e, "修改异常!!!"); + } + } + } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java index 3140f79e..8cc7a5b6 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java @@ -1,14 +1,12 @@ package com.supwisdom.dlpay.system.service; import com.supwisdom.dlpay.api.bean.JsonResult; -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.api.domain.*; import com.supwisdom.dlpay.framework.util.PageResult; import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean; import com.supwisdom.dlpay.system.bean.CitizenCardShowBean; import com.supwisdom.dlpay.system.bean.PersonParamBean; +import com.supwisdom.dlpay.util.WebCheckException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -48,4 +46,16 @@ public interface UserDataService { * */ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true) PageResult getUserCitizenCardPage(CitizenCardSearchBean param, int pageNo, int pageSize); + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + boolean doSaveNewCitizenCard(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno, + String signstatus, String username, String sex, String idtype, String idno, String mobile, + String email) throws Exception; + + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + boolean doUpdateCitizenCard(String cid, String bkid, String cardno, String cardphyid, String expiredate, String cardstatus, + String bankcardno, String signstatus, String username, String sex, String idtype, String idno, + String mobile, String email) throws Exception; + } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java index a42e6362..01105f89 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java @@ -1,14 +1,10 @@ package com.supwisdom.dlpay.system.service.impl; import com.supwisdom.dlpay.api.bean.JsonResult; -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.api.dao.*; +import com.supwisdom.dlpay.api.domain.*; +import com.supwisdom.dlpay.api.types.IDTypes; +import com.supwisdom.dlpay.api.types.SexTypes; import com.supwisdom.dlpay.framework.data.SystemDateTime; import com.supwisdom.dlpay.framework.service.SystemUtilService; import com.supwisdom.dlpay.framework.tenant.TenantContext; @@ -17,6 +13,8 @@ import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean; import com.supwisdom.dlpay.system.bean.CitizenCardShowBean; import com.supwisdom.dlpay.system.bean.PersonParamBean; import com.supwisdom.dlpay.system.service.UserDataService; +import com.supwisdom.dlpay.util.ConstantUtil; +import com.supwisdom.dlpay.util.WebCheckException; import org.hibernate.query.internal.NativeQueryImpl; import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +27,7 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import java.math.BigInteger; +import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -44,6 +43,8 @@ public class UserDataServiceImpl implements UserDataService { private SystemUtilService systemUtilService; @Autowired private PersonIdentityDao personIdentityDao; + @Autowired + private CardDao cardDao; @PersistenceContext private EntityManager entityManager; @@ -195,7 +196,7 @@ public class UserDataServiceImpl implements UserDataService { @Override public PageResult getUserCitizenCardPage(CitizenCardSearchBean param, int pageNo, int pageSize) { - StringBuffer querySql = new StringBuffer("select t.id as cid,t.cardno,t.cardtype,t.cardphyid,case when t.status='closed' then 'closed' else t.trans_status end as status,t.expiredate,a.id as bkid,a.cardno as bankcardno,a.signed,t.lastsaved,t.userid,p.name as username,p.idtype,p.idno,p.mobile,p.email \n" + + StringBuffer querySql = new StringBuffer("select t.id as cid,t.cardno,t.cardtype,t.cardphyid,case when t.status='closed' then 'closed' else t.trans_status end as status,t.expiredate,a.id as bkid,a.cardno as bankcardno,a.signed,t.lastsaved,t.userid,p.name as username,p.idtype,p.idno,p.mobile,p.email,p.sex \n" + "from tb_card t left join tb_card a on a.cardtype='bankcard' and a.cardphyid=t.cardphyid and a.userid=t.userid left join tb_person p on p.userid=t.userid \n" + "where t.cardtype='citizencard' "); StringBuffer countSql = new StringBuffer("select count(t.id) as cnt \n" + @@ -251,4 +252,331 @@ public class UserDataServiceImpl implements UserDataService { BigInteger cnt = (BigInteger) countQuery.getSingleResult(); return new PageResult<>(cnt.longValue(), list); } + + private boolean checkCitizenCardData(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno, + String signstatus, String username, String sex, String idtype, String idno, String mobile, + String email) throws WebCheckException { + if (StringUtil.isEmpty(cardno)) throw new WebCheckException("市民卡号不能为空"); + if (!StringUtil.isNumber(cardno.trim())) throw new WebCheckException("请正确填写市民卡号"); + + if (StringUtil.isEmpty(cardphyid)) throw new WebCheckException("物理卡号不能为空"); + if (!StringUtil.isCardphyid(cardphyid.trim()) || cardphyid.trim().length() != 8) + throw new WebCheckException("请正确填写八位物理卡号(八位十六进制数,字母大写)"); + + if (StringUtil.isEmpty(expiredate)) throw new WebCheckException("请填写卡有效期"); + if (!DateUtil.checkDatetimeValid(expiredate.trim(), "yyyy-MM-dd")) throw new WebCheckException("请正确填写卡有效期"); + + if (StringUtil.isEmpty(cardstatus)) throw new WebCheckException("请选择卡状态"); + if (!Arrays.asList(TradeDict.STATUS_NORMAL, TradeDict.STATUS_CLOSED, TradeDict.STATUS_ABNORMAL, TradeDict.STATUS_UNUSE).contains(cardstatus.trim())) + throw new WebCheckException("请正确选择卡状态"); + + if (StringUtil.isEmpty(bankcardno)) throw new WebCheckException("请填写银行卡号"); + if (!StringUtil.isBankcardno(bankcardno.trim())) throw new WebCheckException("请正确填写银行卡号"); + + if (StringUtil.isEmpty(signstatus)) throw new WebCheckException("请选择银行卡签约状态"); + if (!"0".equals(signstatus.trim()) && !"1".equals(signstatus.trim())) throw new WebCheckException("请选择银行卡签约状态"); + + if (StringUtil.isEmpty(username)) throw new WebCheckException("请填写姓名"); + + if (StringUtil.isEmpty(sex)) throw new WebCheckException("请选择性别"); + if (Arrays.asList(SexTypes.ALL).contains(sex.trim())) throw new WebCheckException("请正确选择性别"); + + if (StringUtil.isEmpty(idtype)) throw new WebCheckException("请选择证件类别"); + if (-999 == IDTypes.findByValue(idtype.trim())) throw new WebCheckException("请正确选择证件类别"); + + if (StringUtil.isEmpty(idno)) throw new WebCheckException("请填写证件号"); + if (IDTypes.IDCARD.value().equals(idtype.trim()) && !StringUtil.isIdentity(idno.trim())) + throw new WebCheckException("请正确填写身份证号"); + + if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile.trim())) throw new WebCheckException("请正确填写手机号"); + if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email.trim())) throw new WebCheckException("请正确填写电子邮箱"); + return true; + } + + @Override + public boolean doSaveNewCitizenCard(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno, + String signstatus, String username, String sex, String idtype, String idno, String mobile, + String email) throws Exception { + if (checkCitizenCardData(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) { + double maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT); + double lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT); + double daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT); + + TCard cityCard = cardDao.findCardByCardnoAndCardtype(cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD); + if (null != cityCard) throw new WebCheckException("市民卡号已经存在!"); + + TCard bankCard = cardDao.findCardByCardnoAndCardtype(bankcardno.trim(), ConstantUtil.CARDTYPE_BANKCARD); + if (null != bankCard) throw new WebCheckException("银行卡号已经存在!"); + + List cardList = cardDao.findCitizencardByCardphyid(cardphyid.trim()); + if (!StringUtil.isEmpty(cardList)) throw new WebCheckException("物理卡号已经存在!"); + + TPerson person = personDao.findByIdentity(idtype.trim(), idno.trim()); + if (null != person && username.trim().equals(person.getName())) + throw new WebCheckException("证件号对应的用户已经存在,且姓名不匹配!"); + + SystemDateTime dt = systemUtilService.getSysdatetime(); + if (null != person) { + boolean needUpdate = false; + if (!sex.trim().equals(person.getSex())) { + person.setSex(sex.trim()); + needUpdate = true; + } + if (!StringUtil.isEmpty(mobile) && !mobile.trim().equals(person.getMobile())) { + person.setMobile(mobile.trim()); + needUpdate = true; + } + if (!StringUtil.isEmpty(email) && !email.trim().equals(person.getEmail())) { + person.setEmail(email.trim()); + needUpdate = true; + } + if (needUpdate) { + person.setLastsaved(dt.getHostdatetime()); + personDao.save(person); + } + } else { + person = new TPerson(); + person.setName(username.trim()); + person.setSex(sex.trim()); + person.setStatus(TradeDict.STATUS_NORMAL); + person.setIdtype(idtype.trim()); + person.setIdno(idno.trim()); + person.setEmail(null == email ? null : email.trim()); + person.setMobile(null == mobile ? null : mobile.trim()); + person.setLastsaved(dt.getHostdatetime()); + person.setTenantid(TenantContext.getTenantSchema()); + person = personDao.save(person); + + TAccount account = new TAccount(); + account.setAccname(person.getName()); + account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT); + account.setUserid(person.getUserid()); + account.setTransStatus(person.getStatus()); + account.setBalance(0D); + account.setAvailbal(0D); + account.setFrozebal(0D); + account.setLowfreeFlag(false); + account.setLowfreeLimit(lowfreeLimit); + account.setDaylimit(daylimit); + account.setMaxbal(maxbal); + account.setLasttranstime(dt.getSysdate()); + account.setLastdayDpsamt(0D); + account.setLastdayTransamt(0D); + account.setOpendate(dt.getHostdate()); + account.setTac(Signature.SPY_TAC); + account.setTenantid(person.getTenantid()); + account = accountDao.save(account); + account.setTac(account.generateTac()); + accountDao.save(account); + } + + cityCard = new TCard(); //新增市民卡 + cityCard.setCardno(cardno.trim()); + cityCard.setCardtype(ConstantUtil.CARDTYPE_CITIZENCARD); + cityCard.setCardphyid(cardphyid.trim()); + cityCard.setStatus(TradeDict.STATUS_NORMAL); + cityCard.setTransStatus(cardstatus.trim()); + if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) { + cityCard.setStatus(TradeDict.STATUS_CLOSED); + cityCard.setTransStatus(TradeDict.STATUS_ABNORMAL); + } + cityCard.setExpiredate(DateUtil.unParseToDateFormat(expiredate.trim())); + cityCard.setSigned(false); + cityCard.setUserid(person.getUserid()); + cityCard.setLastsaved(dt.getHostdatetime()); + cityCard.setTenantid(person.getTenantid()); + cardDao.save(cityCard); + + bankCard = new TCard(); //新增银行卡 + bankCard.setCardno(bankcardno.trim()); + bankCard.setCardtype(ConstantUtil.CARDTYPE_BANKCARD); + bankCard.setCardphyid(cardphyid.trim()); + bankCard.setStatus(TradeDict.STATUS_NORMAL); + bankCard.setTransStatus(TradeDict.STATUS_NORMAL); + if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) { + bankCard.setStatus(TradeDict.STATUS_CLOSED); + } + bankCard.setExpiredate("21991231"); + bankCard.setSigned("1".equals(signstatus.trim())); + bankCard.setUserid(person.getUserid()); + bankCard.setLastsaved(dt.getHostdatetime()); + bankCard.setTenantid(person.getTenantid()); + if (TradeDict.STATUS_NORMAL.equals(bankCard.getStatus())) { + cardDao.closedBankcardStatusByUserid(bankCard.getUserid()); //注销其他银行卡 + } + cardDao.save(bankCard); + return true; + } + return false; + } + + private TCard findCardById(String id) { + if (!StringUtil.isEmpty(id)) return cardDao.getById(id.trim()); + return null; + } + + @Override + public boolean doUpdateCitizenCard(String cid, String bkid, String cardno, String cardphyid, String expiredate, String cardstatus, + String bankcardno, String signstatus, String username, String sex, String idtype, String idno, + String mobile, String email) throws Exception { + TCard cityCard = findCardById(cid); + TCard bankCard = findCardById(bkid); + if (null == cityCard || null == bankCard || + !ConstantUtil.CARDTYPE_CITIZENCARD.equals(cityCard.getCardtype()) || + !ConstantUtil.CARDTYPE_BANKCARD.equals(bankCard.getCardtype()) || + !cityCard.getUserid().equals(bankCard.getUserid()) || + !cityCard.getCardphyid().equals(bankCard.getCardphyid())) { + throw new WebCheckException("请求参数错误,请重新查询!"); + } + TPerson person = personDao.findByUserid(cityCard.getUserid()); + if(null==person) throw new WebCheckException("请求参数错误,请重新查询!"); + + if (checkCitizenCardData(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) { + TPerson owner = null; //市民卡拥有者 + SystemDateTime dt = systemUtilService.getSysdatetime(); + if(idtype.trim().equals(person.getIdtype()) && idno.trim().equals(person.getIdno())){ + //同一用户 + if(!username.trim().equals(person.getName())) throw new WebCheckException("数据异常!证件号对应的用户已经存在,但姓名不匹配!"); + owner = person; + }else{ + //改变了所有者 + TPerson newPerson = personDao.findByIdentity(idtype.trim(), idno.trim()); + if(null!=newPerson && !username.trim().equals(newPerson.getName())) throw new WebCheckException("数据异常!证件号对应的用户已经存在,但姓名不匹配!"); + if(null==newPerson){ + //新增 + double maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT); + double lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT); + double daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT); + + newPerson = new TPerson(); + newPerson.setName(username.trim()); + newPerson.setSex(sex.trim()); + newPerson.setStatus(TradeDict.STATUS_NORMAL); + newPerson.setIdtype(idtype.trim()); + newPerson.setIdno(idno.trim()); + newPerson.setEmail(null == email ? null : email.trim()); + newPerson.setMobile(null == mobile ? null : mobile.trim()); + newPerson.setLastsaved(dt.getHostdatetime()); + newPerson.setTenantid(TenantContext.getTenantSchema()); + newPerson = personDao.save(newPerson); + + TAccount account = new TAccount(); + account.setAccname(newPerson.getName()); + account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT); + account.setUserid(newPerson.getUserid()); + account.setTransStatus(newPerson.getStatus()); + account.setBalance(0D); + account.setAvailbal(0D); + account.setFrozebal(0D); + account.setLowfreeFlag(false); + account.setLowfreeLimit(lowfreeLimit); + account.setDaylimit(daylimit); + account.setMaxbal(maxbal); + account.setLasttranstime(dt.getSysdate()); + account.setLastdayDpsamt(0D); + account.setLastdayTransamt(0D); + account.setOpendate(dt.getHostdate()); + account.setTac(Signature.SPY_TAC); + account.setTenantid(person.getTenantid()); + account = accountDao.save(account); + account.setTac(account.generateTac()); + accountDao.save(account); + } + owner = newPerson; + } + if(null== owner) throw new WebCheckException("业务处理异常!"); + + boolean needUpdate = false; + if (!sex.trim().equals(owner.getSex())) { + owner.setSex(sex.trim()); + needUpdate = true; + } + if (!StringUtil.isEmpty(mobile) && !mobile.trim().equals(owner.getMobile())) { + owner.setMobile(mobile.trim()); + needUpdate = true; + } + if (!StringUtil.isEmpty(email) && !email.trim().equals(owner.getEmail())) { + owner.setEmail(email.trim()); + needUpdate = true; + } + if (needUpdate) { + owner.setLastsaved(dt.getHostdatetime()); + personDao.save(owner); + } + + boolean cardUpdate = false; + if(!cardno.trim().equals(cityCard.getCardno())){ + //市民卡号变更 + if (null != cardDao.findCardByCardnoAndCardtype(cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD)) throw new WebCheckException("市民卡号已经存在"); + + cityCard.setCardno(cardno.trim()); + cardUpdate = true; + } + if(!cardphyid.trim().equals(cityCard.getCardphyid())){ + List cardList = cardDao.findCitizencardByCardphyidWithoutOldId(cardphyid.trim(), cityCard.getId()); + if (!StringUtil.isEmpty(cardList)) throw new WebCheckException("物理卡号已经存在!"); + + cityCard.setCardphyid(cardphyid.trim()); + cardUpdate = true; + } + + String newExpiredate = DateUtil.unParseToDateFormat(expiredate); + if(!newExpiredate.equals(cityCard.getExpiredate())){ + cityCard.setExpiredate(newExpiredate); + cardUpdate = true; + } + + if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) { + if (!TradeDict.STATUS_CLOSED.equals(cityCard.getStatus())) { + cityCard.setStatus(TradeDict.STATUS_CLOSED); + cardUpdate = true; + } + } else if (!cardstatus.trim().equals(cityCard.getTransStatus())) { + cityCard.setTransStatus(cardstatus.trim()); + cardUpdate = true; + } + if(!cityCard.getUserid().equals(owner.getUserid())){ + cityCard.setUserid(owner.getUserid()); + cardUpdate = true; + } + + if(cardUpdate){ + cityCard.setLastsaved(dt.getHostdatetime()); + cardDao.save(cityCard); + } + + boolean bankcardUpdate = false; + if(!bankcardno.trim().equals(bankCard.getCardno())){ + if (null != cardDao.findCardByCardnoAndCardtype(bankcardno.trim(), ConstantUtil.CARDTYPE_BANKCARD)) throw new WebCheckException("银行卡号已经存在"); + bankCard.setCardno(bankcardno.trim()); + bankCard.setSigned("1".equals(signstatus)); + bankcardUpdate = true; + } + if(!cardphyid.trim().equals(bankCard.getCardphyid())){ + bankCard.setCardphyid(cityCard.getCardphyid()); + bankcardUpdate = true; + } + if(TradeDict.STATUS_CLOSED.equals(cardstatus.trim()) && !TradeDict.STATUS_CLOSED.equals(bankCard.getStatus())){ + bankCard.setStatus(TradeDict.STATUS_CLOSED); + bankcardUpdate = true; + } + if(!bankCard.getSigned().equals("1".equals(signstatus.trim()))){ + bankCard.setSigned("1".equals(signstatus.trim())); + bankcardUpdate = true; + } + + if(!bankCard.getUserid().equals(owner.getUserid())){ + bankCard.setUserid(cityCard.getUserid()); + bankcardUpdate = true; + } + + if(bankcardUpdate){ + bankCard.setLastsaved(dt.getHostdatetime()); + cardDao.save(bankCard); + } + + return true; + } + return false; + } } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt index 4981023b..210c3316 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt @@ -55,6 +55,7 @@ class CardServiceImpl : CardService { var resp = UserInforResponse() var cityCard: TCard? if (!citizencardno.isNullOrEmpty()) { + //根据市民卡号查询 cityCard = cardDao.findCardByCardnoAndCardtype(citizencardno, ConstantUtil.CARDTYPE_CITIZENCARD) if (cityCard == null) { resp.retcode = 1 @@ -65,6 +66,21 @@ class CardServiceImpl : CardService { if (bankcard != null) { resp.bankcardno = bankcard.cardno } + } else if (!bankcardno.isNullOrEmpty()) { + //根据银行卡号查询 + val bankcard = cardDao.findCardByCardnoAndCardtype(bankcardno?.trim(), ConstantUtil.CARDTYPE_BANKCARD) + if (bankcard == null) { + resp.retcode = 1 + resp.retmsg = "银行卡不存在" + return resp + } + resp.bankcardno = bankcard.cardno + cityCard = cardDao.findBankcardByCitizencard(bankcard.userid, ConstantUtil.CARDTYPE_CITIZENCARD, bankcard.cardphyid) + if (cityCard == null) { + resp.retcode = 1 + resp.retmsg = "市民卡不存在" + return resp + } } else { resp.retcode = 1 resp.retmsg = "参数错误" diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt index fde2ac5d..b0dbb6b2 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt @@ -14,6 +14,7 @@ import com.supwisdom.dlpay.framework.dao.ShopaccDao import com.supwisdom.dlpay.framework.domain.TShop import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.framework.tenant.TenantContext import com.supwisdom.dlpay.framework.util.* import com.supwisdom.dlpay.util.EnumCheck import org.springframework.beans.factory.annotation.Autowired @@ -111,8 +112,8 @@ class ShopServiceImpl : ShopService { override fun checkDownloadShopBillParam(param: DownloadShopBillParam): Boolean { if (!StringUtil.isEmpty(param.checkdate)) { - val ctl = settleCtlDao.findByTenantId(param.tenantid) - ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "[tenantid=${param.tenantid}]未找到结算状态表") + val ctl = settleCtlDao.findByTenantId(TenantContext.getTenantSchema()) + ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "[tenantid=${TenantContext.getTenantSchema()}]未找到结算状态表") if (DateUtil.compareDatetime(param.checkdate, "${ctl.settledate}", "yyyyMMdd") >= 0) { throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "对账单未生成") //未结算,不返回对账单 } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt index b368d5aa..9937a316 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt @@ -185,7 +185,7 @@ class TransactionReconciliationServiceImpl : TransactionReconciliationService { //需要补账 chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_NOCHARGE chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_ADD - chkdtl.remark = "本地未入账,需要补助" + chkdtl.remark = "本地未入账,需要补帐" transactionChkdtlDao.save(chkdtl) //对账明细表更新 } } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt index 38f1499c..b997a618 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt @@ -34,7 +34,7 @@ class CommonServiceImpl : CommonService { ver += Manifests.read("Payapi-Buildtime") ?: "no" ver } catch (ex: Exception) { - ex.printStackTrace() +// ex.printStackTrace() "unknown" } } diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql index cefb0072..bcdf83ce 100644 --- a/payapi/src/main/resources/data.sql +++ b/payapi/src/main/resources/data.sql @@ -303,7 +303,14 @@ INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) VALUES (90, '', 37, '查询', '/user/card', '{tenantid}'); INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) VALUES (91, '', 38, '查询', '/report/shoptodaybusiness', '{tenantid}'); - +INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) +VALUES (92, '', 37, '新增跳转', '/user/load4addcard', '{tenantid}'); +INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) +VALUES (93, '', 37, '新增', '/user/cardadd', '{tenantid}'); +INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) +VALUES (94, '', 37, '修改跳转', '/user/load4modifycard', '{tenantid}'); +INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) +VALUES (95, '', 37, '修改', '/user/cardupdate', '{tenantid}'); INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid) VALUES ('ff8080816b7947ed016b795577300036', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); @@ -461,6 +468,15 @@ INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid VALUES ('ff8080816db87e27016db9446fda008b', 90, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") VALUES ('4028ee9f6e5d95d8016e5d99e8dd0013', 91, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") +VALUES ('ff8080816ec5cfd5016ec5d16d470006', 92, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") +VALUES ('ff8080816ec5cfd5016ec5d16d470007', 93, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") +VALUES ('ff8080816ecaebf8016ecaeedcec0004', 94, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") +VALUES ('ff8080816ecafb4e016ecafd58400005', 95, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); + INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid") diff --git a/payapi/src/main/resources/templates/system/user/addcard.html b/payapi/src/main/resources/templates/system/user/addcard.html new file mode 100644 index 00000000..01511068 --- /dev/null +++ b/payapi/src/main/resources/templates/system/user/addcard.html @@ -0,0 +1,175 @@ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ + \ No newline at end of file diff --git a/payapi/src/main/resources/templates/system/user/card.html b/payapi/src/main/resources/templates/system/user/card.html index 138d2b9d..251daa40 100644 --- a/payapi/src/main/resources/templates/system/user/card.html +++ b/payapi/src/main/resources/templates/system/user/card.html @@ -44,6 +44,13 @@ autocomplete="off" class="layui-input"/> +
+ +
+ + +
+
@@ -54,10 +61,10 @@ @@ -76,6 +83,7 @@ toolbar: '#citizencard-table-toolbar', cols: [ [ + {type:'radio', align: 'center', width: 35, fixed: 'left'}, {field:'cardno',title:'市民卡号', align: 'center', width: 120, fixed: 'left', sort: true}, {field:'cardphyid',title:'物理卡号', align: 'center', width: 120, fixed: 'left'}, { @@ -137,25 +145,64 @@ ] }); + $("#citizencard-search-btn").click(function(){ + table.reload('citizencardSearchTable', { + where: { + cardno: $("#citizencard-search-cardno").val(), + cardphyid: $("#citizencard-search-cardphyid").val(), + bankcardno: $("#citizencard-search-bankcardno").val(), + username: $("#citizencard-search-username").val(), + idno: $("#citizencard-search-idno").val() + }, page: {curr: 1} + }); + }); + + $("#citizencard-search-btn-reset").click(function(){ + $("#citizencard-search-cardno").val(""); + $("#citizencard-search-cardphyid").val(""); + $("#citizencard-search-bankcardno").val(""); + $("#citizencard-search-username").val(""); + $("#citizencard-search-idno").val(""); + }); + table.on('toolbar(citizencardSearchTable-filter)', function (obj) { switch (obj.event) { - case 'search': - table.reload('citizencardSearchTable', { - where: { - cardno: $("#citizencard-search-cardno").val(), - cardphyid: $("#citizencard-search-cardphyid").val(), - bankcardno: $("#citizencard-search-bankcardno").val(), - username: $("#citizencard-search-username").val(), - idno: $("#citizencard-search-idno").val() - }, page: {curr: 1} + case 'add': + admin.popupCenter({ + title: '添加市民卡', + area: '700px', + path: '[[@{/user/load4addcard}]]', + finish: function () { + var tmpNo = admin.getTempData('t_addCityNo'); + if(undefined !=tmpNo && !isempty(tmpNo)){ + table.reload('citizencardSearchTable', { where: {cardno: tmpNo}, page: {curr: 1} }); + }else{ + table.reload('citizencardSearchTable', {}); + } + } }); break; - case 'clear': - $("#citizencard-search-cardno").val(""); - $("#citizencard-search-cardphyid").val(""); - $("#citizencard-search-bankcardno").val(""); - $("#citizencard-search-username").val(""); - $("#citizencard-search-idno").val(""); + case 'modify': + var checkStatus = table.checkStatus('citizencardSearchTable'); + if(checkStatus.data.length ==0){ + layer.msg("请先选中要修改的市民卡", {icon: 2, time: 1500}); + return; + } + admin.putTempData('t_citycard', checkStatus.data[0]); + admin.popupCenter({ + title: '修改市民卡', + area: '700px', + path: '[[@{/user/load4modifycard}]]', + finish: function () { + var tmpUpNo = admin.getTempData('t_updateCityNo'); + console.log("xx",tmpUpNo); + if(undefined !=tmpUpNo && !isempty(tmpUpNo)){ + table.reload('citizencardSearchTable', { where: {cardno: tmpUpNo}, page: {curr: 1} }); + }else{ + table.reload('citizencardSearchTable', {}); + } + } + }); break; } }); diff --git a/payapi/src/main/resources/templates/system/user/updatecard.html b/payapi/src/main/resources/templates/system/user/updatecard.html new file mode 100644 index 00000000..7e1cb74e --- /dev/null +++ b/payapi/src/main/resources/templates/system/user/updatecard.html @@ -0,0 +1,208 @@ +
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ + \ No newline at end of file -- 2.17.1