子系统对账接口和市民卡页面查询功能
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 0000000..4c42943
--- /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 0000000..5133b65
--- /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 2ff2c01..84a951e 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 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 0000000..8505f39
--- /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 0000000..b5c095d
--- /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 31c7fae..fe353a1 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.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 @@
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<CitizenCardShowBean> 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 59afc6d..421d45b 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 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
List<TreeSelectNode> getTreeSelectShops();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ long getDownloadShopBillCount(DownloadShopBillParam param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<DownloadShopBillData> 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 942196e..3140f79 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.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 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param);
+
+
+ /**
+ * 市民卡信息查询
+ * */
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<CitizenCardShowBean> 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 82fbdc2..f50b0f6 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.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.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 @@
@Autowired
private ShopDao shopDao;
+ @PersistenceContext
+ private EntityManager entityManager;
+
@Override
public PageResult<TPersondtl> getPersondtlPage(UserdtlSearchBean searchBean, int pageNo, int pageSize) {
Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno"));
@@ -162,4 +173,56 @@
}
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<DownloadShopBillData> 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<DownloadShopBillData> 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 8b04848..a42e636 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.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 @@
@Autowired
private PersonIdentityDao personIdentityDao;
+ @PersistenceContext
+ private EntityManager entityManager;
+
@Override
public PageResult<TPerson> getPersonsByKey(PersonParamBean param) {
Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
@@ -181,4 +192,63 @@
public PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param) {
return null;
}
+
+ @Override
+ public PageResult<CitizenCardShowBean> 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<CitizenCardShowBean> 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 873e619..ba129e6 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 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 a722aec..c1dbf6a 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.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 @@
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<Any> {
@@ -71,4 +78,52 @@
.transException(et, "业务处理错误"))
}
}
+
+ /**
+ * 获取商户对账单接口
+ * 错误时返回json串{""}
+ */
+ @PostMapping("/downloadshopbill")
+ fun downloadShopBill(@RequestBody param: DownloadShopBillParam, response: HttpServletResponse): ResponseEntity<Any> {
+ 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 ff890fb..fde2ac5 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 @@
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<ShopTypes, String>()
@@ -98,4 +108,27 @@
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 697bc11..f02c2e2 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 @@
@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 32cfd2f..446650b 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -73,6 +73,9 @@
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 @@
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 @@
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 @@
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 0000000..138d2b9
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/card.html
@@ -0,0 +1,163 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">市民卡查询</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_user_index">用户中心</a>
+ <a><cite>市民卡查询</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="citizencard-search-form">
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline" style="margin-right: 20px;">
+ <label class="layui-form-label">市民卡号</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="cardno" id="citizencard-search-cardno" placeholder="市民卡号" maxlength="10"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="margin-right: 20px;">
+ <label class="layui-form-label">物理卡号</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="cardphyid" id="citizencard-search-cardphyid" placeholder="物理卡号" maxlength="8"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="margin-right: 20px;">
+ <label class="layui-form-label">银行卡号</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="bankcardno" id="citizencard-search-bankcardno" placeholder="银行卡号" maxlength="19"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="margin-right: 20px;margin-top: 10px;">
+ <label class="layui-form-label">姓名</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="username" id="citizencard-search-username" placeholder="姓名" maxlength="20"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="margin-right: 20px;margin-top: 10px;">
+ <label class="layui-form-label">证件号</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="idno" id="citizencard-search-idno" placeholder="证件号" maxlength="18"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="citizencardSearchTable" lay-filter="citizencardSearchTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="citizencard-table-toolbar">
+ <div class="layui-btn-container">
+ <button class="layui-btn layui-btn-sm" id="btn-citizencard-search-ok" lay-event="search"><i
+ class="layui-icon"></i>搜 索</button>
+ <button class="layui-btn layui-btn-sm" id="btn-citizencard-search-clear" lay-event="clear"><i
+ class="layui-icon"></i>清 空</button>
+ </div>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+
+ table.render({
+ id: 'citizencardSearchTable',
+ title: '市民卡信息查询',
+ elem: '#citizencardSearchTable',
+ url: '[[@{/user/cardlist}]]',
+ page: true,
+ toolbar: '#citizencard-table-toolbar',
+ cols: [
+ [
+ {field:'cardno',title:'市民卡号', align: 'center', width: 120, fixed: 'left', sort: true},
+ {field:'cardphyid',title:'物理卡号', align: 'center', width: 120, fixed: 'left'},
+ {
+ field: 'expiredate', title: '有效期', align: 'center', width: 120, templet: function (d) {
+ return dateFormat('' + d.expiredate);
+ }
+ },
+ {
+ field: 'status', title: '状态', align: 'center', width: 80, sort: true, templet: function (d) {
+ if (d.status == 'closed') {
+ return '<span class="layui-badge layui-bg-gray">注销</span>';
+ } else if (d.status == 'normal') {
+ return '<span class="layui-badge layui-bg-green">正常</span>';
+ } else if (d.status == 'unuse') {
+ return '<span class="layui-badge layui-bg-blue">未启用</span>';
+ } else if (d.status == 'abnormal') {
+ return '<span class="layui-badge">异常</span>';
+ } else if (d.status == 'lost') {
+ return '<span class="layui-badge">挂失</span>';
+ } else if (d.status == 'locked') {
+ return '<span class="layui-badge">锁定</span>';
+ } else if (d.status == 'frozen') {
+ return '<span class="layui-badge">冻结</span>';
+ } else {
+ return d.status;
+ }
+ }
+ },
+ {field: 'bankcardno', title: '银行卡号', align: 'center', width: 200, sort: true},
+ {
+ field: 'signed', title: '是否签约', align: 'center', width: 110, sort: true, templet: function (d) {
+ if (d.signed) {
+ return '<span class="layui-badge layui-bg-green">已签约</span>';
+ } else {
+ return '<span class="layui-badge layui-bg-gray">未签约</span>';
+ }
+ }
+ },
+ {field: 'username', title: '用户名', align: 'center', width: 120},
+ {
+ field: 'idtype', title: '证件类型', align: 'center', width: 100, templet: function (d) {
+ return getTempDictValue('idtypeList', d.idtype);
+ }
+ },
+ {field: 'idno', title: '证件号', align: 'center', width: 180},
+ {field: 'mobile', title: '手机号', align: 'center', width: 120},
+ {field: 'email', title: '电子邮箱', align: 'center', width: 200},
+ {
+ field: 'lastsaved',
+ title: '更新时间',
+ align: 'center',
+ width: 200,
+ sort: true,
+ templet: function (d) {
+ return admin.formatDate(d.lastsaved);
+ }
+ }
+ ]
+ ]
+ });
+
+ 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}
+ });
+ break;
+ case 'clear':
+ $("#citizencard-search-cardno").val("");
+ $("#citizencard-search-cardphyid").val("");
+ $("#citizencard-search-bankcardno").val("");
+ $("#citizencard-search-username").val("");
+ $("#citizencard-search-idno").val("");
+ break;
+ }
+ });
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/user/index.html b/payapi/src/main/resources/templates/system/user/index.html
index 5507955..a1d07a8 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'},