From: Xia Kaixiang Date: Mon, 11 Nov 2019 02:52:02 +0000 (+0800) Subject: 子系统对账接口和市民卡页面查询功能 X-Git-Tag: 1.0.8^2 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=d8f45e62a45a246c8cb3de60e2c924530cb6f5d2;p=epayment%2Ffood_payapi.git 子系统对账接口和市民卡页面查询功能 --- diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillData.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillData.java new file mode 100644 index 00000000..4c42943b --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillData.java @@ -0,0 +1,29 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DownloadShopBillData { + private String billno; //子系统下单号 + private String refno; //核心平台流水号 + private Integer amount; //交易金额,单位:分 + private String paytime; //支付时间 yyyyMMddHHmmss + private String status; // 状态,只查询成功流水 固定:SUCCESS + private String sourcetype; //支付类型 alipay/wechat/citizenCard/... (请求参数传sourcetype时,只返回该sourcetype的流水) + private String dtltype; //流水类型(water/carbus/canteen/shopmarket/... [生活用水/乘车/食堂就餐/商超消费/...]) (请求参数传dtltype时,只返回该dtltype的流水) + + @Override + public String toString() { + return "{" + + "billno='" + billno + '\'' + + ", refno='" + refno + '\'' + + ", amount=" + amount + + ", paytime='" + paytime + '\'' + + ", status='" + status + '\'' + + ", sourcetype='" + sourcetype + '\'' + + ", dtltype='" + dtltype + '\'' + + '}'; + } +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillParam.java new file mode 100644 index 00000000..5133b65f --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DownloadShopBillParam.java @@ -0,0 +1,37 @@ +package com.supwisdom.dlpay.api.bean; + +import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.Sign; +import com.supwisdom.dlpay.api.exception.RequestParamCheckException; +import com.supwisdom.dlpay.api.util.DateUtil; +import lombok.Getter; +import lombok.Setter; +import org.springframework.util.StringUtils; + +import javax.validation.constraints.NotNull; + +@Getter +@Setter +public class DownloadShopBillParam extends APIRequestParam { + @Sign + @NotNull(message = "对账日期不能为空") + private String checkdate; + + @Sign + @NotNull(message = "商户账号不能为空") + private String shopaccno; + + @Sign + private String sourcetype; + + @Sign + private String dtltype; + + @Override + public boolean checkParam() throws RequestParamCheckException { + if (!DateUtil.checkDatetimeValid(checkdate, DateUtil.DATE_FMT)) + throw new RequestParamCheckException("对账日期错误[yyyyMMdd]"); + if(StringUtils.isEmpty(shopaccno)) throw new RequestParamCheckException("商户账号不能为空"); + return true; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java index 2ff2c018..84a951e0 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java @@ -128,7 +128,7 @@ public class TradeErrorCode { public static final int SQL_EXCEPTION = 30004; // SQL处理异常 - public static final int REQUEST_PARAM_EEROR = 30005; // 请求参数实体位置错误 + public static final int NO_DEAL_EEROR = 30005; // 无交易记录 //============= 交易错误 ============// public static final int CARD_NOT_EXISTS = 40000; //卡不存在 diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardSearchBean.java new file mode 100644 index 00000000..8505f39a --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardSearchBean.java @@ -0,0 +1,60 @@ +package com.supwisdom.dlpay.system.bean; + +public class CitizenCardSearchBean { + private String cardno; //市民卡号 + private String cardphyid; //物理ID + private String bankcardno; //银行卡号 + private String username; //姓名 + private String idno; //证件号 + + public CitizenCardSearchBean() { + } + + public CitizenCardSearchBean(String cardno, String cardphyid, String bankcardno, String username, String idno) { + this.cardno = cardno; + this.cardphyid = cardphyid; + this.bankcardno = bankcardno; + this.username = username; + this.idno = idno; + } + + public String getCardno() { + return cardno; + } + + public void setCardno(String cardno) { + this.cardno = cardno; + } + + public String getCardphyid() { + return cardphyid; + } + + public void setCardphyid(String cardphyid) { + this.cardphyid = cardphyid; + } + + public String getBankcardno() { + return bankcardno; + } + + public void setBankcardno(String bankcardno) { + this.bankcardno = bankcardno; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getIdno() { + return idno; + } + + public void setIdno(String idno) { + this.idno = idno; + } +} 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 new file mode 100644 index 00000000..b5c095d4 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java @@ -0,0 +1,148 @@ +package com.supwisdom.dlpay.system.bean; + +public class CitizenCardShowBean { + private String cid; //市民卡tb_card的id + private String cardno; + private String cardtype; + private String cardphyid; + private String status; + private String expiredate; + private String bkid; //市民卡对应银行卡tb_card的id + private String bankcardno; + private Boolean signed; + private String lastsaved; + private String userid; + private String username; + private String idtype; + private String idno; + private String mobile; + private String email; + + public String getCid() { + return cid; + } + + public void setCid(String cid) { + this.cid = cid; + } + + public String getCardno() { + return cardno; + } + + public void setCardno(String cardno) { + this.cardno = cardno; + } + + public String getCardtype() { + return cardtype; + } + + public void setCardtype(String cardtype) { + this.cardtype = cardtype; + } + + public String getCardphyid() { + return cardphyid; + } + + public void setCardphyid(String cardphyid) { + this.cardphyid = cardphyid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getExpiredate() { + return expiredate; + } + + public void setExpiredate(String expiredate) { + this.expiredate = expiredate; + } + + public String getBkid() { + return bkid; + } + + public void setBkid(String bkid) { + this.bkid = bkid; + } + + public String getBankcardno() { + return bankcardno; + } + + public void setBankcardno(String bankcardno) { + this.bankcardno = bankcardno; + } + + public Boolean getSigned() { + return signed; + } + + public void setSigned(Boolean signed) { + this.signed = signed; + } + + public String getLastsaved() { + return lastsaved; + } + + public void setLastsaved(String lastsaved) { + this.lastsaved = lastsaved; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getIdtype() { + return idtype; + } + + public void setIdtype(String idtype) { + this.idtype = idtype; + } + + public String getIdno() { + return idno; + } + + public void setIdno(String idno) { + this.idno = idno; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} 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 31c7faef..fe353a1f 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 @@ -10,6 +10,8 @@ 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.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; @@ -161,4 +163,35 @@ public class UserController { map.put("userid", userid); return "system/user/pointdtl"; } + + /** + * ==================================================== + * 市民卡查询 + * ==================================================== + */ + @GetMapping("/user/card") + public String card() { + return "system/user/card"; + } + + @GetMapping("/user/cardlist") + @PreAuthorize("hasPermission('/user/card','')") + @ResponseBody + public PageResult getBusinessDataList(@RequestParam("page") Integer pageNo, + @RequestParam("limit") Integer pageSize, + @RequestParam(value = "cardno", required = false) String cardno, + @RequestParam(value = "cardphyid", required = false) String cardphyid, + @RequestParam(value = "bankcardno", required = false) String bankcardno, + @RequestParam(value = "username", required = false) String username, + @RequestParam(value = "idno", required = false) String idno) { + try { + if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT; + if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT; + CitizenCardSearchBean param = new CitizenCardSearchBean(cardno, cardphyid, bankcardno, username, idno); + return userDataService.getUserCitizenCardPage(param, pageNo, pageSize); + } catch (Exception e) { + e.printStackTrace(); + return new PageResult<>(99, "系统查询错误"); + } + } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java index 59afc6de..421d45b9 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java @@ -1,5 +1,7 @@ package com.supwisdom.dlpay.system.service; +import com.supwisdom.dlpay.api.bean.DownloadShopBillData; +import com.supwisdom.dlpay.api.bean.DownloadShopBillParam; import com.supwisdom.dlpay.api.domain.TPersondtl; import com.supwisdom.dlpay.api.domain.TShopdtl; import com.supwisdom.dlpay.framework.domain.TDictionary; @@ -22,4 +24,10 @@ public interface DtlDataService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true) List getTreeSelectShops(); + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true) + long getDownloadShopBillCount(DownloadShopBillParam param); + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true) + PageResult getDownloadShopBillPage(DownloadShopBillParam param, int offset, int count); } 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 942196e3..3140f79e 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 @@ -6,6 +6,8 @@ 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.util.PageResult; +import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean; +import com.supwisdom.dlpay.system.bean.CitizenCardShowBean; import com.supwisdom.dlpay.system.bean.PersonParamBean; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -39,4 +41,11 @@ public interface UserDataService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true) PageResult getUserPointDTL(PersonParamBean param); + + + /** + * 市民卡信息查询 + * */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true) + PageResult getUserCitizenCardPage(CitizenCardSearchBean param, int pageNo, int pageSize); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java index 82fbdc23..f50b0f6f 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java @@ -1,5 +1,7 @@ package com.supwisdom.dlpay.system.service.impl; +import com.supwisdom.dlpay.api.bean.DownloadShopBillData; +import com.supwisdom.dlpay.api.bean.DownloadShopBillParam; import com.supwisdom.dlpay.api.dao.PersondtlDao; import com.supwisdom.dlpay.api.dao.ShopdtlDao; import com.supwisdom.dlpay.api.domain.TPersondtl; @@ -18,6 +20,8 @@ import com.supwisdom.dlpay.system.bean.TreeSelectNode; import com.supwisdom.dlpay.system.bean.UserdtlSearchBean; import com.supwisdom.dlpay.system.service.DictionaryProxy; import com.supwisdom.dlpay.system.service.DtlDataService; +import org.hibernate.query.internal.NativeQueryImpl; +import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -26,10 +30,14 @@ import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -47,6 +55,9 @@ public class DtlDataServiceImpl implements DtlDataService { @Autowired private ShopDao shopDao; + @PersistenceContext + private EntityManager entityManager; + @Override public PageResult getPersondtlPage(UserdtlSearchBean searchBean, int pageNo, int pageSize) { Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno")); @@ -162,4 +173,56 @@ public class DtlDataServiceImpl implements DtlDataService { } return result; } + + @Override + public long getDownloadShopBillCount(DownloadShopBillParam param) { + StringBuffer countSql = new StringBuffer("select count(t.refno) as cnt " + + "from tb_shopdtl t left join tb_transactionmain a on t.refno=a.refno where t.status='success' and t.accdate=:accdate and t.shopaccno=:shopaccno "); + if (!StringUtil.isEmpty(param.getSourcetype())) { + countSql.append(" and t.sourcetype=:sourcetype "); + } + if (!StringUtil.isEmpty(param.getDtltype())) { + countSql.append(" and t.dtltype=:dtltype "); + } + Query countQuery = entityManager.createNativeQuery(countSql.toString()); + countQuery.setParameter("accdate", param.getCheckdate().trim()); + countQuery.setParameter("shopaccno", param.getShopaccno().trim()); + if (!StringUtil.isEmpty(param.getSourcetype())) { + countQuery.setParameter("sourcetype", param.getSourcetype().trim()); + } + if (!StringUtil.isEmpty(param.getDtltype())) { + countQuery.setParameter("dtltype", param.getDtltype().trim()); + } + BigInteger cnt = (BigInteger) countQuery.getSingleResult(); + if (null != cnt) return cnt.longValue(); + return 0; + } + + @Override + public PageResult getDownloadShopBillPage(DownloadShopBillParam param, int offset, int count) { + StringBuffer querySql = new StringBuffer("select a.outtradeno as billno,t.refno,cast(round(cast(t.amount as numeric)*100,0) as int4) as amount,to_char(a.end_time,'yyyyMMddHHmmss') as paytime,'SUCCESS' as status,t.sourcetype,t.dtltype \n" + + "from tb_shopdtl t left join tb_transactionmain a on t.refno=a.refno where t.status='success' and t.accdate=:accdate and t.shopaccno=:shopaccno "); + if (!StringUtil.isEmpty(param.getSourcetype())) { + querySql.append(" and t.sourcetype=:sourcetype "); + } + if (!StringUtil.isEmpty(param.getDtltype())) { + querySql.append(" and t.dtltype=:dtltype "); + } + querySql.append(" order by t.refno "); + Query query = entityManager.createNativeQuery(querySql.toString()); + query.setParameter("accdate", param.getCheckdate().trim()); + query.setParameter("shopaccno", param.getShopaccno().trim()); + if (!StringUtil.isEmpty(param.getSourcetype())) { + query.setParameter("sourcetype", param.getSourcetype().trim()); + } + if (!StringUtil.isEmpty(param.getDtltype())) { + query.setParameter("dtltype", param.getDtltype().trim()); + } + query.setFirstResult(offset); //(pageNo - 1) * pageSize + query.setMaxResults(count); //分页显示 + query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DownloadShopBillData.class)); + List list = query.getResultList(); + long cnt = getDownloadShopBillCount(param); + return new PageResult<>(cnt, list); + } } 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 8b04848b..a42e6362 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 @@ -13,14 +13,22 @@ import com.supwisdom.dlpay.framework.data.SystemDateTime; import com.supwisdom.dlpay.framework.service.SystemUtilService; import com.supwisdom.dlpay.framework.tenant.TenantContext; 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.PersonParamBean; import com.supwisdom.dlpay.system.service.UserDataService; +import org.hibernate.query.internal.NativeQueryImpl; +import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; import java.util.List; import java.util.Optional; @@ -37,6 +45,9 @@ public class UserDataServiceImpl implements UserDataService { @Autowired private PersonIdentityDao personIdentityDao; + @PersistenceContext + private EntityManager entityManager; + @Override public PageResult getPersonsByKey(PersonParamBean param) { Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize() @@ -181,4 +192,63 @@ public class UserDataServiceImpl implements UserDataService { public PageResult getUserPointDTL(PersonParamBean param) { return null; } + + @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" + + "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" + + "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' "); + if (!StringUtil.isEmpty(param.getCardno())) { + querySql.append(" and t.cardno=:cardno "); + countSql.append(" and t.cardno=:cardno "); + } + if (!StringUtil.isEmpty(param.getCardphyid())) { + querySql.append(" and t.cardphyid=:cardphyid "); + countSql.append(" and t.cardphyid=:cardphyid "); + } + if (!StringUtil.isEmpty(param.getBankcardno())) { + querySql.append(" and a.cardno=:bankcardno "); + countSql.append(" and a.cardno=:bankcardno "); + } + if (!StringUtil.isEmpty(param.getUsername())) { + querySql.append(" and p.name like :uname "); + countSql.append(" and p.name like :uname "); + } + if (!StringUtil.isEmpty(param.getIdno())) { + querySql.append(" and p.idno like :idno "); + countSql.append(" and p.idno like :idno "); + } + querySql.append(" order by t.cardno "); + Query query = entityManager.createNativeQuery(querySql.toString()); + Query countQuery = entityManager.createNativeQuery(countSql.toString()); + if (!StringUtil.isEmpty(param.getCardno())) { + query.setParameter("cardno", param.getCardno().trim()); + countQuery.setParameter("cardno", param.getCardno().trim()); + } + if (!StringUtil.isEmpty(param.getCardphyid())) { + query.setParameter("cardphyid", param.getCardphyid().trim()); + countQuery.setParameter("cardphyid", param.getCardphyid().trim()); + } + if (!StringUtil.isEmpty(param.getBankcardno())) { + query.setParameter("bankcardno", param.getBankcardno().trim()); + countQuery.setParameter("bankcardno", param.getBankcardno().trim()); + } + if (!StringUtil.isEmpty(param.getUsername())) { + query.setParameter("uname", "%" + param.getUsername().trim() + "%"); + countQuery.setParameter("uname", "%" + param.getUsername().trim() + "%"); + } + if (!StringUtil.isEmpty(param.getIdno())) { + query.setParameter("idno", "%" + param.getIdno().trim() + "%"); + countQuery.setParameter("idno", "%" + param.getIdno().trim() + "%"); + } + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); //分页显示 + query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CitizenCardShowBean.class)); + List list = query.getResultList(); + BigInteger cnt = (BigInteger) countQuery.getSingleResult(); + return new PageResult<>(cnt.longValue(), list); + } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java index 873e619d..ba129e6c 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java @@ -89,4 +89,6 @@ public class ConstantUtil { public static final String OPERCHK_CHKMODE_ADD = "新增"; public static final String OPERCHK_CHKMODE_MODIFY = "修改"; public static final String OPERCHK_CHKMODE_DELETE = "删除"; + + public static final String CHKFILE_DELIMITER = "|"; } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt index a722aece..c1dbf6a7 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt @@ -1,5 +1,7 @@ package com.supwisdom.dlpay.api.controller +import com.supwisdom.dlpay.api.bean.DownloadShopBillData +import com.supwisdom.dlpay.api.bean.DownloadShopBillParam import com.supwisdom.dlpay.api.bean.OpenShopParam import com.supwisdom.dlpay.api.bean.QueryShopParam import com.supwisdom.dlpay.api.exception.RequestParamCheckException @@ -9,12 +11,15 @@ import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.tenant.TenantContext import com.supwisdom.dlpay.framework.util.TradeErrorCode +import com.supwisdom.dlpay.system.service.DtlDataService +import com.supwisdom.dlpay.util.ConstantUtil import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import java.net.URLDecoder -import javax.servlet.http.HttpServletRequest +import java.nio.charset.StandardCharsets import javax.servlet.http.HttpServletResponse +import java.io.OutputStream as OutputStream @RestController @RequestMapping("/api/shop") @@ -23,6 +28,8 @@ class ShopAPIController { private lateinit var shopService: ShopService @Autowired private lateinit var commonService: CommonService + @Autowired + private lateinit var dtlDataService: DtlDataService @PostMapping("/open") fun openAccount(@RequestBody param: OpenShopParam): ResponseEntity { @@ -71,4 +78,52 @@ class ShopAPIController { .transException(et, "业务处理错误")) } } + + /** + * 获取商户对账单接口 + * 错误时返回json串{""} + */ + @PostMapping("/downloadshopbill") + fun downloadShopBill(@RequestBody param: DownloadShopBillParam, response: HttpServletResponse): ResponseEntity { + val outputStream = response.outputStream + try { + shopService.checkDownloadShopBillParam(param) //判断该天是否已结算,未结算直接报错 + val count = dtlDataService.getDownloadShopBillCount(param) + if (count <= 0) { + return ResponseEntity.ok(ResponseBodyBuilder.create().fail(TradeErrorCode.NO_DEAL_EEROR, "当天无交易记录")) + } + parseFile(dtlDataService, param, count, outputStream) + return ResponseEntity.ok(outputStream) + } catch (ex: RequestParamCheckException) { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .requestException(ex, "请求参数错误")) + } catch (et: TransactionException) { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .transException(et, "业务处理错误")) + } finally { + outputStream?.close() + } + } + + private fun parseFile(dtlDataService: DtlDataService, param: DownloadShopBillParam, count: Long, output: OutputStream) { + writeLine(output, "billno", "refno", "amount", "paytime", "status", "sourcetype", "dtltype") //第一行输出标题 + val pageSize = 5000 //每次查询笔数 + var offset = 0 + while (offset < count) { + var page = dtlDataService.getDownloadShopBillPage(param, offset, pageSize) + if (null == page || page.data.isNullOrEmpty()) break + page!!.data.forEach { + writeLine(output, it.billno, it.refno, it.amount, it.paytime, it.status, it.sourcetype, it.dtltype) //输出数据 + } + offset += pageSize + } + } + + private fun writeLine(output: OutputStream, vararg columns: Any) { + for (item in columns) { + output.write(item.toString().toByteArray(StandardCharsets.UTF_8)) + output.write(ConstantUtil.CHKFILE_DELIMITER.toByteArray(StandardCharsets.UTF_8)) + } + output.write("\n".toByteArray()) + } } \ No newline at end of file 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 ff890fb9..fde2ac5d 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 @@ -1,21 +1,25 @@ package com.supwisdom.dlpay.api.service.impl +import com.supwisdom.dlpay.api.bean.DownloadShopBillParam import com.supwisdom.dlpay.api.bean.OpenShopParam +import com.supwisdom.dlpay.api.exception.RequestParamCheckException import com.supwisdom.dlpay.api.service.ShopService +import com.supwisdom.dlpay.api.service.SourceTypeService import com.supwisdom.dlpay.api.types.ShopTypes import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.dao.DictionaryDao +import com.supwisdom.dlpay.framework.dao.SettleCtlDao import com.supwisdom.dlpay.framework.dao.ShopDao 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.util.StringUtil -import com.supwisdom.dlpay.framework.util.Subject -import com.supwisdom.dlpay.framework.util.TradeDict -import com.supwisdom.dlpay.framework.util.TradeErrorCode +import com.supwisdom.dlpay.framework.util.* import com.supwisdom.dlpay.util.EnumCheck import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service +import javax.persistence.EntityManager +import javax.persistence.PersistenceContext /** * Created by shuwei on 2019/4/15. @@ -28,6 +32,12 @@ class ShopServiceImpl : ShopService { private lateinit var shopaccDao: ShopaccDao @Autowired private lateinit var systemUtilService: SystemUtilService + @Autowired + private lateinit var dictionaryDao: DictionaryDao + @Autowired + private lateinit var settleCtlDao: SettleCtlDao + @Autowired + private lateinit var sourceTypeService: SourceTypeService private val shoptypeCheck = EnumCheck() @@ -98,4 +108,27 @@ class ShopServiceImpl : ShopService { shopDao.getByThirdUniqueIdenty(shopUniqueId) } } + + 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}]未找到结算状态表") + if (DateUtil.compareDatetime(param.checkdate, "${ctl.settledate}", "yyyyMMdd") >= 0) { + throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "对账单未生成") //未结算,不返回对账单 + } + } + if (!StringUtil.isEmpty(param.shopaccno)) { + shopaccDao.findByShopaccno(param.shopaccno.trim()) + ?: throw RequestParamCheckException("指定商户不存在!") + } + if (!StringUtil.isEmpty(param.sourcetype)) { + sourceTypeService.getBySourceType(param.sourcetype.trim()) + ?: throw RequestParamCheckException("支付类型错误") + } + if (!StringUtil.isEmpty(param.dtltype)) { + dictionaryDao.getByDicttypeAndDictval(Dictionary.DTLTYPES, param.dtltype.trim()) + ?: throw RequestParamCheckException("流水类型错误") + } + return true + } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt index 697bc11f..f02c2e29 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt @@ -1,5 +1,6 @@ package com.supwisdom.dlpay.api.service +import com.supwisdom.dlpay.api.bean.DownloadShopBillParam import com.supwisdom.dlpay.api.bean.OpenShopParam import com.supwisdom.dlpay.framework.domain.TShop import org.springframework.transaction.annotation.Propagation @@ -20,4 +21,7 @@ interface ShopService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) fun findByShopBySearch(shopid: Int?, shopaccno: String?, shopUniqueId: String?): TShop? + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) + fun checkDownloadShopBillParam(param: DownloadShopBillParam): Boolean } \ No newline at end of file diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql index 32cfd2f0..446650b4 100644 --- a/payapi/src/main/resources/data.sql +++ b/payapi/src/main/resources/data.sql @@ -73,6 +73,9 @@ INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon" VALUES (35, NULL, 1, NULL, '', '/thirdchk/chkfile', '对账明细查询', 332, 33, '{tenantid}'); INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid) VALUES (36, NULL, 1, NULL, '', '/shop/shopcheck', '商户审批', 2, 7, '{tenantid}'); +INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid) +VALUES (37, NULL, 1, NULL, '', '/user/card', '市民卡查询', 1, 19, '{tenantid}'); + INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid) VALUES ('ff8080816b7947ed016b7955772c0032', 1, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); @@ -136,6 +139,8 @@ INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid) VALUES ('ff8083816c8468e8016c846d7a570017', 35, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid) VALUES ('ff8080816db87e27016db88be41a0014', 36, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid) +VALUES ('ff8080816db87e27016db88be41f0015', 37, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) @@ -290,6 +295,8 @@ INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) VALUES (88, '', 36, '审核跳转', '/shop/opercheck', '{tenantid}'); INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) VALUES (89, '', 36, '审核', '/shop/docheckshop', '{tenantid}'); +INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid) +VALUES (90, '', 37, '查询', '/user/card', '{tenantid}'); INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid) @@ -444,6 +451,8 @@ INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid VALUES ('ff8080816db87e27016db94468da0089', 88, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") VALUES ('ff8080816db87e27016db94468da008a', 89, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}'); +INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid") +VALUES ('ff8080816db87e27016db9446fda008b', 90, 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/card.html b/payapi/src/main/resources/templates/system/user/card.html new file mode 100644 index 00000000..138d2b9d --- /dev/null +++ b/payapi/src/main/resources/templates/system/user/card.html @@ -0,0 +1,163 @@ +
+
+

市民卡查询

+ + 用户中心 + 市民卡查询 + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+ + + + diff --git a/payapi/src/main/resources/templates/system/user/index.html b/payapi/src/main/resources/templates/system/user/index.html index 5507955d..a1d07a81 100644 --- a/payapi/src/main/resources/templates/system/user/index.html +++ b/payapi/src/main/resources/templates/system/user/index.html @@ -56,7 +56,7 @@ return getTempDictValue('idtypeList', item.idtype); } }, - {field: 'idno', title: '证件号', width: 120, align: 'center', sort: true}, + {field: 'idno', title: '证件号', width: 180, align: 'center', sort: true}, {field: 'email', title: '邮箱', width: 100, align: 'center', sort: true}, {field: 'mobile', title: '手机', width: 120, align: 'center', sort: true}, {field: 'tel', title: '电话', align: 'center'},