diff --git a/bonus-modules/bonus-smart-canteen/pom.xml b/bonus-modules/bonus-smart-canteen/pom.xml
index 08e50d4e..03b083f8 100644
--- a/bonus-modules/bonus-smart-canteen/pom.xml
+++ b/bonus-modules/bonus-smart-canteen/pom.xml
@@ -127,7 +127,16 @@
alipay-sdk-java
4.34.0.ALL
-
+
+ com.alibaba
+ easyexcel
+ 3.0.5
+
+
+ cn.hutool
+ hutool-all
+ 5.8.11
+
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/vo/AccInfoDetailVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/vo/AccInfoDetailVO.java
new file mode 100644
index 00000000..b5501810
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/vo/AccInfoDetailVO.java
@@ -0,0 +1,236 @@
+package com.bonus.core.account.v3.api.vo;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.bonus.core.account.v3.constants.AccStatusEnum;
+import com.bonus.core.common.encrypt.LeNiuDecryptDataProcess;
+import com.bonus.core.common.encrypt.LeNiuDecryptField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@LeNiuDecryptDataProcess
+public class AccInfoDetailVO {
+ @ApiModelProperty("人员id")
+ private Long custId;
+ @ApiModelProperty("人员姓名")
+ @LeNiuDecryptField
+ private String custName;
+ @ApiModelProperty("账户Id")
+ private Long accId;
+ @ApiModelProperty("第三方人员Id")
+ private String custThirdId;
+ @ApiModelProperty("组织id")
+ private Long orgId;
+ @ApiModelProperty("人员类别")
+ private Integer psnType;
+ @ApiModelProperty("账户状态 1正常 2冻结 3销户 4过期")
+ private Integer accStatus;
+ @ApiModelProperty("账户可用总余额(不包括冻结金额)")
+ private BigDecimal accBalTotal;
+ @ApiModelProperty("账户总余额(包含冻结金额)")
+ private BigDecimal accAllBal;
+ @ApiModelProperty("个人钱包(可用)余额/分")
+ private BigDecimal walletBal;
+ @ApiModelProperty("补贴钱包(可用)余额/分")
+ private BigDecimal subsidyBal;
+ @ApiModelProperty("红包余额")
+ private BigDecimal redEnvelope;
+ @ApiModelProperty("个人钱包冻结金额")
+ private BigDecimal walletFreezeBal;
+ @ApiModelProperty("补贴钱包冻结金额")
+ private BigDecimal subFreezeBal;
+ @ApiModelProperty("总冻结金额")
+ private BigDecimal accFreezeBalTotal;
+ @ApiModelProperty("卡序列号")
+ private String serialNum;
+ @ApiModelProperty("卡状态")
+ private Integer cardStatus;
+ @ApiModelProperty("押金")
+ private Integer deposit;
+ @ApiModelProperty("工本费")
+ private Integer productCost;
+
+ public boolean isNormal() {
+ return AccStatusEnum.NORMAL.getKey().equals(this.accStatus);
+ }
+
+ public BigDecimal getAccBalTotal() {
+ return ObjectUtil.isNull(this.accBalTotal) ? BigDecimal.ZERO : this.accBalTotal;
+ }
+
+ public BigDecimal getWalletBal() {
+ return ObjectUtil.isNull(this.walletBal) ? BigDecimal.ZERO : this.walletBal;
+ }
+
+ public BigDecimal getSubsidyBal() {
+ return ObjectUtil.isNull(this.subsidyBal) ? BigDecimal.ZERO : this.subsidyBal;
+ }
+
+ public BigDecimal getRedEnvelope() {
+ return ObjectUtil.isNull(this.redEnvelope) ? BigDecimal.ZERO : this.redEnvelope;
+ }
+
+ public static AccInfoDetailVOBuilder builder() {
+ return new AccInfoDetailVOBuilder();
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public String getCustName() {
+ return this.custName;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public String getCustThirdId() {
+ return this.custThirdId;
+ }
+
+ public Long getOrgId() {
+ return this.orgId;
+ }
+
+ public Integer getPsnType() {
+ return this.psnType;
+ }
+
+ public Integer getAccStatus() {
+ return this.accStatus;
+ }
+
+ public BigDecimal getAccAllBal() {
+ return this.accAllBal;
+ }
+
+ public BigDecimal getWalletFreezeBal() {
+ return this.walletFreezeBal;
+ }
+
+ public BigDecimal getSubFreezeBal() {
+ return this.subFreezeBal;
+ }
+
+ public BigDecimal getAccFreezeBalTotal() {
+ return this.accFreezeBalTotal;
+ }
+
+ public String getSerialNum() {
+ return this.serialNum;
+ }
+
+ public Integer getCardStatus() {
+ return this.cardStatus;
+ }
+
+ public Integer getDeposit() {
+ return this.deposit;
+ }
+
+ public Integer getProductCost() {
+ return this.productCost;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setCustName(final String custName) {
+ this.custName = custName;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setCustThirdId(final String custThirdId) {
+ this.custThirdId = custThirdId;
+ }
+
+ public void setOrgId(final Long orgId) {
+ this.orgId = orgId;
+ }
+
+ public void setPsnType(final Integer psnType) {
+ this.psnType = psnType;
+ }
+
+ public void setAccStatus(final Integer accStatus) {
+ this.accStatus = accStatus;
+ }
+
+ public void setAccBalTotal(final BigDecimal accBalTotal) {
+ this.accBalTotal = accBalTotal;
+ }
+
+ public void setAccAllBal(final BigDecimal accAllBal) {
+ this.accAllBal = accAllBal;
+ }
+
+ public void setWalletBal(final BigDecimal walletBal) {
+ this.walletBal = walletBal;
+ }
+
+ public void setSubsidyBal(final BigDecimal subsidyBal) {
+ this.subsidyBal = subsidyBal;
+ }
+
+ public void setRedEnvelope(final BigDecimal redEnvelope) {
+ this.redEnvelope = redEnvelope;
+ }
+
+ public void setWalletFreezeBal(final BigDecimal walletFreezeBal) {
+ this.walletFreezeBal = walletFreezeBal;
+ }
+
+ public void setSubFreezeBal(final BigDecimal subFreezeBal) {
+ this.subFreezeBal = subFreezeBal;
+ }
+
+ public void setAccFreezeBalTotal(final BigDecimal accFreezeBalTotal) {
+ this.accFreezeBalTotal = accFreezeBalTotal;
+ }
+
+ public void setSerialNum(final String serialNum) {
+ this.serialNum = serialNum;
+ }
+
+ public void setCardStatus(final Integer cardStatus) {
+ this.cardStatus = cardStatus;
+ }
+
+ public void setDeposit(final Integer deposit) {
+ this.deposit = deposit;
+ }
+
+ public void setProductCost(final Integer productCost) {
+ this.productCost = productCost;
+ }
+
+ @Data
+ public static class AccInfoDetailVOBuilder {
+ private Long custId;
+ private String custName;
+ private Long accId;
+ private String custThirdId;
+ private Long orgId;
+ private Integer psnType;
+ private Integer accStatus;
+ private BigDecimal accBalTotal;
+ private BigDecimal accAllBal;
+ private BigDecimal walletBal;
+ private BigDecimal subsidyBal;
+ private BigDecimal redEnvelope;
+ private BigDecimal walletFreezeBal;
+ private BigDecimal subFreezeBal;
+ private BigDecimal accFreezeBalTotal;
+ private String serialNum;
+ private Integer cardStatus;
+ private Integer deposit;
+ private Integer productCost;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/constants/AccStatusEnum.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/constants/AccStatusEnum.java
new file mode 100644
index 00000000..3584dfca
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/constants/AccStatusEnum.java
@@ -0,0 +1,74 @@
+package com.bonus.core.account.v3.constants;
+
+import cn.hutool.core.collection.ListUtil;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum AccStatusEnum {
+ NORMAL(1, "正常"),
+ DEACTIVATE(2, "停用"),
+ CANCEL(3, "注销"),
+ OVERDUE(4, "过期");
+
+ private final Integer key;
+ private final String desc;
+
+ private AccStatusEnum(Integer key, String desc) {
+ this.key = key;
+ this.desc = desc;
+ }
+
+ public static String getDesc(Integer key) {
+ AccStatusEnum[] var1 = values();
+ int var2 = var1.length;
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ AccStatusEnum temp = var1[var3];
+ if (temp.getKey().equals(key)) {
+ return temp.getDesc();
+ }
+ }
+
+ return "";
+ }
+
+ public static AccStatusEnum getEnum(Integer key) {
+ AccStatusEnum[] var1 = values();
+ int var2 = var1.length;
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ AccStatusEnum temp = var1[var3];
+ if (temp.getKey().equals(key)) {
+ return temp;
+ }
+ }
+
+ return null;
+ }
+
+ public static List sendMqStatus() {
+ return Arrays.asList(DEACTIVATE.getKey(), OVERDUE.getKey());
+ }
+
+ public static List accStatusForAppWork() {
+ return ListUtil.toList(new Integer[]{NORMAL.getKey(), DEACTIVATE.getKey(), OVERDUE.getKey()});
+ }
+
+ public static boolean ifNotAllowRechargeRepeal(Integer key) {
+ return ListUtil.toList(new Integer[]{CANCEL.getKey()}).contains(key);
+ }
+
+ public Integer getKey() {
+ return this.key;
+ }
+
+ public String getDesc() {
+ return this.desc;
+ }
+
+ // $FF: synthetic method
+ private static AccStatusEnum[] $values() {
+ return new AccStatusEnum[]{NORMAL, DEACTIVATE, CANCEL, OVERDUE};
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/custom/AccForAppCustomBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/custom/AccForAppCustomBusiness.java
new file mode 100644
index 00000000..89c649af
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/custom/AccForAppCustomBusiness.java
@@ -0,0 +1,34 @@
+package com.bonus.core.account.v3.custom;
+
+import cn.hutool.core.collection.CollUtil;
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.account.v4.app.dto.AppAccInfoV4DTO;
+import com.bonus.core.account.v4.app.vo.AppAccInfoV4VO;
+import com.bonus.core.common.custom.business.CustomBusiness;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class AccForAppCustomBusiness implements CustomBusiness {
+ private static final Logger log = LoggerFactory.getLogger(AccForAppCustomBusiness.class);
+
+ @Override
+ public String name() {
+ return "账户移动端";
+ }
+
+ @Override
+ public List versions() {
+ return CollUtil.newArrayList(new CustomBusiness.Version[]{CustomBusiness.Version.of("5.1.0", "初版")});
+ }
+
+ public void didGetAccInfoDetail(AccInfoDetailVO content) {
+ log.info("获取小牛账户详情后操作");
+ }
+
+ public void didGetAccInfoDetailV4(AppAccInfoV4DTO appAccInfoV4DTO, AppAccInfoV4VO appAccInfoV4VO) {
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccInfoMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccInfoMapper.java
new file mode 100644
index 00000000..fe81d369
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccInfoMapper.java
@@ -0,0 +1,18 @@
+package com.bonus.core.account.v3.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.account.v3.model.AccInfo;
+import com.bonus.core.account.v3.web.vo.AccInfoVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Mapper
+public interface AccInfoMapper extends BaseMapper {
+ AccInfoVO getAccInfoVOByCustId(@Param("custId") Long custId);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java
new file mode 100644
index 00000000..752e1240
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java
@@ -0,0 +1,15 @@
+package com.bonus.core.account.v3.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bonus.core.account.v3.model.AccTradeWalletDetail;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Mapper
+public interface AccTradeWalletDetailMapper extends BaseMapper {
+ List listCustMonthAccSubsidyExpirationTrade(@Param("custId") Long custId, @Param("startDateTime") LocalDateTime startDateTime, @Param("endDateTime") LocalDateTime endDateTime);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccWalletInfoMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccWalletInfoMapper.java
new file mode 100644
index 00000000..935fe741
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccWalletInfoMapper.java
@@ -0,0 +1,14 @@
+package com.bonus.core.account.v3.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bonus.core.account.v3.model.AccWalletInfo;
+import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface AccWalletInfoMapper extends BaseMapper {
+ List queryAccWalletInfoVOListByCustId(@Param("custId") Long custId);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccInfo.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccInfo.java
new file mode 100644
index 00000000..672f4876
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccInfo.java
@@ -0,0 +1,125 @@
+package com.bonus.core.account.v3.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@TableName("acc_info")
+@ApiModel("账户信息表")
+public class AccInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @TableId
+ private Long id;
+ private Long accId;
+ private Long custId;
+ private Integer scope;
+ private LocalDate endDate;
+ private Integer accStatus;
+ private String payPwd;
+ @TableField(
+ value = "crby",
+ fill = FieldFill.INSERT
+ )
+ private String crby;
+ private LocalDateTime crtime;
+ @TableField(
+ value = "upby",
+ fill = FieldFill.UPDATE
+ )
+ private String upby;
+ private LocalDateTime uptime;
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Integer getScope() {
+ return this.scope;
+ }
+
+ public LocalDate getEndDate() {
+ return this.endDate;
+ }
+
+ public Integer getAccStatus() {
+ return this.accStatus;
+ }
+
+ public String getPayPwd() {
+ return this.payPwd;
+ }
+
+ public String getCrby() {
+ return this.crby;
+ }
+
+ public LocalDateTime getCrtime() {
+ return this.crtime;
+ }
+
+ public String getUpby() {
+ return this.upby;
+ }
+
+ public LocalDateTime getUptime() {
+ return this.uptime;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setScope(final Integer scope) {
+ this.scope = scope;
+ }
+
+ public void setEndDate(final LocalDate endDate) {
+ this.endDate = endDate;
+ }
+
+ public void setAccStatus(final Integer accStatus) {
+ this.accStatus = accStatus;
+ }
+
+ public void setPayPwd(final String payPwd) {
+ this.payPwd = payPwd;
+ }
+
+ public void setCrby(final String crby) {
+ this.crby = crby;
+ }
+
+ public void setCrtime(final LocalDateTime crtime) {
+ this.crtime = crtime;
+ }
+
+ public void setUpby(final String upby) {
+ this.upby = upby;
+ }
+
+ public void setUptime(final LocalDateTime uptime) {
+ this.uptime = uptime;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccTradeWalletDetail.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccTradeWalletDetail.java
new file mode 100644
index 00000000..591e4a7f
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccTradeWalletDetail.java
@@ -0,0 +1,147 @@
+package com.bonus.core.account.v3.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@TableName("acc_trade_wallet_detail")
+public class AccTradeWalletDetail implements Serializable {
+ @TableId(
+ type = IdType.AUTO
+ )
+ private Long id;
+ private Long tradeId;
+ private Long custId;
+ private Integer walletId;
+ private BigDecimal amount;
+ private BigDecimal walletBal;
+ private Integer tradeType;
+ private LocalDateTime crtime;
+ private LocalDateTime uptime;
+ private BigDecimal frozenBalance;
+ private LocalDateTime tradeTime;
+ private LocalDateTime validateTime;
+ private BigDecimal useAmount;
+ private Integer expiredClear;
+ @TableField(
+ exist = false
+ )
+ private static final long serialVersionUID = 1L;
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public Long getTradeId() {
+ return this.tradeId;
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Integer getWalletId() {
+ return this.walletId;
+ }
+
+ public BigDecimal getAmount() {
+ return this.amount;
+ }
+
+ public BigDecimal getWalletBal() {
+ return this.walletBal;
+ }
+
+ public Integer getTradeType() {
+ return this.tradeType;
+ }
+
+ public LocalDateTime getCrtime() {
+ return this.crtime;
+ }
+
+ public LocalDateTime getUptime() {
+ return this.uptime;
+ }
+
+ public BigDecimal getFrozenBalance() {
+ return this.frozenBalance;
+ }
+
+ public LocalDateTime getTradeTime() {
+ return this.tradeTime;
+ }
+
+ public LocalDateTime getValidateTime() {
+ return this.validateTime;
+ }
+
+ public BigDecimal getUseAmount() {
+ return this.useAmount;
+ }
+
+ public Integer getExpiredClear() {
+ return this.expiredClear;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public void setTradeId(final Long tradeId) {
+ this.tradeId = tradeId;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setWalletId(final Integer walletId) {
+ this.walletId = walletId;
+ }
+
+ public void setAmount(final BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public void setWalletBal(final BigDecimal walletBal) {
+ this.walletBal = walletBal;
+ }
+
+ public void setTradeType(final Integer tradeType) {
+ this.tradeType = tradeType;
+ }
+
+ public void setCrtime(final LocalDateTime crtime) {
+ this.crtime = crtime;
+ }
+
+ public void setUptime(final LocalDateTime uptime) {
+ this.uptime = uptime;
+ }
+
+ public void setFrozenBalance(final BigDecimal frozenBalance) {
+ this.frozenBalance = frozenBalance;
+ }
+
+ public void setTradeTime(final LocalDateTime tradeTime) {
+ this.tradeTime = tradeTime;
+ }
+
+ public void setValidateTime(final LocalDateTime validateTime) {
+ this.validateTime = validateTime;
+ }
+
+ public void setUseAmount(final BigDecimal useAmount) {
+ this.useAmount = useAmount;
+ }
+
+ public void setExpiredClear(final Integer expiredClear) {
+ this.expiredClear = expiredClear;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccWalletInfo.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccWalletInfo.java
new file mode 100644
index 00000000..70a2da2e
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/model/AccWalletInfo.java
@@ -0,0 +1,126 @@
+package com.bonus.core.account.v3.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@TableName("acc_wallet_info")
+public class AccWalletInfo implements Serializable {
+ @TableId
+ private Long custId;
+ private Long accId;
+ private Integer walletId;
+ private BigDecimal walletBal;
+ private BigDecimal limitBalance;
+ private BigDecimal frozenBalance;
+ private LocalDateTime expiredTime;
+ private BigDecimal lastSubsidyAmount;
+ private LocalDateTime lastSubsidyTime;
+ private LocalDateTime crtime;
+ private LocalDateTime uptime;
+ private Long updateId;
+ @TableField(
+ exist = false
+ )
+ private static final long serialVersionUID = 1L;
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public Integer getWalletId() {
+ return this.walletId;
+ }
+
+ public BigDecimal getWalletBal() {
+ return this.walletBal;
+ }
+
+ public BigDecimal getLimitBalance() {
+ return this.limitBalance;
+ }
+
+ public BigDecimal getFrozenBalance() {
+ return this.frozenBalance;
+ }
+
+ public LocalDateTime getExpiredTime() {
+ return this.expiredTime;
+ }
+
+ public BigDecimal getLastSubsidyAmount() {
+ return this.lastSubsidyAmount;
+ }
+
+ public LocalDateTime getLastSubsidyTime() {
+ return this.lastSubsidyTime;
+ }
+
+ public LocalDateTime getCrtime() {
+ return this.crtime;
+ }
+
+ public LocalDateTime getUptime() {
+ return this.uptime;
+ }
+
+ public Long getUpdateId() {
+ return this.updateId;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setWalletId(final Integer walletId) {
+ this.walletId = walletId;
+ }
+
+ public void setWalletBal(final BigDecimal walletBal) {
+ this.walletBal = walletBal;
+ }
+
+ public void setLimitBalance(final BigDecimal limitBalance) {
+ this.limitBalance = limitBalance;
+ }
+
+ public void setFrozenBalance(final BigDecimal frozenBalance) {
+ this.frozenBalance = frozenBalance;
+ }
+
+ public void setExpiredTime(final LocalDateTime expiredTime) {
+ this.expiredTime = expiredTime;
+ }
+
+ public void setLastSubsidyAmount(final BigDecimal lastSubsidyAmount) {
+ this.lastSubsidyAmount = lastSubsidyAmount;
+ }
+
+ public void setLastSubsidyTime(final LocalDateTime lastSubsidyTime) {
+ this.lastSubsidyTime = lastSubsidyTime;
+ }
+
+ public void setCrtime(final LocalDateTime crtime) {
+ this.crtime = crtime;
+ }
+
+ public void setUptime(final LocalDateTime uptime) {
+ this.uptime = uptime;
+ }
+
+ public void setUpdateId(final Long updateId) {
+ this.updateId = updateId;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccInfoService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccInfoService.java
new file mode 100644
index 00000000..82c27f63
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccInfoService.java
@@ -0,0 +1,8 @@
+package com.bonus.core.account.v3.service;
+
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.account.v3.web.dto.AccInfoDetailDTO;
+
+public interface AccInfoService {
+ AccInfoDetailVO getAccInfoDetail(AccInfoDetailDTO content);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java
new file mode 100644
index 00000000..8cdfe906
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java
@@ -0,0 +1,11 @@
+package com.bonus.core.account.v3.service;
+
+
+import com.bonus.core.account.v3.model.AccTradeWalletDetail;
+
+import java.util.List;
+
+public interface AccTradeWalletDetailService {
+
+ List listCustMonthAccSubsidyExpirationTrade(Long custId);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletInfoService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletInfoService.java
new file mode 100644
index 00000000..a9b3dc05
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletInfoService.java
@@ -0,0 +1,11 @@
+package com.bonus.core.account.v3.service;
+
+import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface AccWalletInfoService {
+ List findAccWalletInfoVOListByCustId(Long custId);
+ BigDecimal calculateSubsidyExpirationAmount(Long custId);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java
new file mode 100644
index 00000000..8880d8a1
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java
@@ -0,0 +1,109 @@
+package com.bonus.core.account.v3.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bonus.common.core.exception.ServiceException;
+import com.bonus.constant.LeConstants;
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.account.v3.constants.AccStatusEnum;
+import com.bonus.core.account.v3.mapper.AccInfoMapper;
+import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum;
+import com.bonus.core.account.v3.model.AccInfo;
+import com.bonus.core.account.v3.service.AccInfoService;
+import com.bonus.core.account.v3.service.AccWalletInfoService;
+import com.bonus.core.account.v3.utils.AccUtils;
+import com.bonus.core.account.v3.web.dto.AccInfoDetailDTO;
+import com.bonus.core.account.v3.web.vo.AccInfoVO;
+import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
+import com.bonus.core.account.v4.api.CardInfoServiceV4Api;
+import com.bonus.core.account.v4.web.model.AccCard;
+import com.bonus.core.common.redis.RedisUtil;
+import com.bonus.core.common.utils.TenantContextHolder;
+import com.bonus.utils.Id;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.page.PageMethod;
+import com.google.common.collect.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+public class AccInfoServiceImpl extends ServiceImpl implements AccInfoService {
+ private static final Logger log = LoggerFactory.getLogger(AccInfoServiceImpl.class);
+ public static final String ACC_NOT_EXITS = "acc_not_exits";
+ private static final Long CACHE_EXPIRATION_TIME = 60L;
+ @Resource
+ @Lazy
+ private AccWalletInfoService accWalletInfoService;
+ @Resource
+ @Lazy
+ private CardInfoServiceV4Api cardInfoServiceV4Api;
+
+
+ @Override
+ public AccInfoDetailVO getAccInfoDetail(AccInfoDetailDTO content) {
+ AccInfoVO accInfo = this.getAccInfoVoByCustId(content.getCustId());
+ AccInfoDetailVO accInfoDetailVO = new AccInfoDetailVO();
+ BeanUtil.copyProperties(accInfo, accInfoDetailVO, new String[0]);
+ accInfoDetailVO.setWalletBal(AccUtils.getWalletBal(accInfo.getWalletInfoList(), AccWalletIdEnum.WALLET.getKey()));
+ accInfoDetailVO.setSubsidyBal(AccUtils.getWalletBal(accInfo.getWalletInfoList(), AccWalletIdEnum.SUBSIDY.getKey()));
+ accInfoDetailVO.setRedEnvelope(AccUtils.getWalletBal(accInfo.getWalletInfoList(), AccWalletIdEnum.LUCK_MONEY.getKey()));
+ accInfoDetailVO.setWalletFreezeBal(AccUtils.getWalletFrozenBal(accInfo.getWalletInfoList(), AccWalletIdEnum.WALLET.getKey()));
+ accInfoDetailVO.setSubFreezeBal(AccUtils.getWalletFrozenBal(accInfo.getWalletInfoList(), AccWalletIdEnum.SUBSIDY.getKey()));
+ accInfoDetailVO.setAccFreezeBalTotal(accInfo.getAccFreezeBalTotal());
+ if (content.getIfQueryCardInfoBoolean()) {
+ AccCard accCard = this.cardInfoServiceV4Api.queryOneCardInfoByCustId(accInfo.getCustId());
+ if (ObjectUtil.isNotNull(accCard)) {
+ accInfoDetailVO.setSerialNum(accCard.getSerialNum());
+ accInfoDetailVO.setCardStatus(accCard.getCardStatus());
+ accInfoDetailVO.setDeposit(accCard.getDeposit());
+ accInfoDetailVO.setProductCost(accCard.getProductCost());
+ }
+ }
+ return accInfoDetailVO;
+ }
+
+ public AccInfoVO getAccInfoVoByCustId(Long custId) {
+ log.info("获取账户(钱包)信息,入参={}", custId);
+ AccInfoVO accInfoVO = ((AccInfoMapper)this.baseMapper).getAccInfoVOByCustId(custId);
+ if (ObjectUtil.isNull(accInfoVO)) {
+ throw new ServiceException("账户不存在");
+ } else {
+ List walletInfoList = this.accWalletInfoService.findAccWalletInfoVOListByCustId(custId);
+ this.setAccInfoVODetailList(accInfoVO, walletInfoList);
+ log.info("获取账户(钱包)信息,出参={}", JSONUtil.toJsonStr(accInfoVO));
+ return accInfoVO;
+ }
+ }
+ protected void setAccInfoVODetailList(AccInfoVO accInfoVO, List walletInfoList) {
+ if (ObjectUtil.isNotEmpty(walletInfoList)) {
+ accInfoVO.setAccBalTotal((BigDecimal)walletInfoList.stream().map(AccWalletInfoVO::getWalletBal).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+ BigDecimal frozenBalanceAll = (BigDecimal)walletInfoList.stream().map(AccWalletInfoVO::getFrozenBalance).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ accInfoVO.setAccFreezeBalTotal(frozenBalanceAll);
+ accInfoVO.setAccAllBal(NumberUtil.add(accInfoVO.getAccBalTotal(), accInfoVO.getAccFreezeBalTotal()));
+ accInfoVO.setWalletInfoList(walletInfoList);
+ }
+
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java
new file mode 100644
index 00000000..ce533b3f
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java
@@ -0,0 +1,25 @@
+package com.bonus.core.account.v3.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bonus.core.account.v3.mapper.AccTradeWalletDetailMapper;
+import com.bonus.core.account.v3.model.AccTradeWalletDetail;
+import com.bonus.core.account.v3.service.AccTradeWalletDetailService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.List;
+
+@Service
+public class AccTradeWalletDetailServiceImpl extends ServiceImpl implements AccTradeWalletDetailService {
+ private static final Logger log = LoggerFactory.getLogger(AccTradeWalletDetailServiceImpl.class);
+
+
+ @Override
+ public List listCustMonthAccSubsidyExpirationTrade(Long custId) {
+ return ((AccTradeWalletDetailMapper)this.baseMapper).listCustMonthAccSubsidyExpirationTrade(custId, LocalDateTime.now(), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59));
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletInfoServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletInfoServiceImpl.java
new file mode 100644
index 00000000..56fd6aa0
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletInfoServiceImpl.java
@@ -0,0 +1,55 @@
+package com.bonus.core.account.v3.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bonus.core.account.v3.mapper.AccWalletInfoMapper;
+import com.bonus.core.account.v3.model.AccTradeWalletDetail;
+import com.bonus.core.account.v3.model.AccWalletInfo;
+import com.bonus.core.account.v3.service.AccTradeWalletDetailService;
+import com.bonus.core.account.v3.service.AccWalletInfoService;
+import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class AccWalletInfoServiceImpl extends ServiceImpl implements AccWalletInfoService {
+ private static final Logger log = LoggerFactory.getLogger(AccWalletInfoServiceImpl.class);
+
+ @Resource
+ @Lazy
+ private AccTradeWalletDetailService accTradeWalletDetailService;
+ @Override
+ public List findAccWalletInfoVOListByCustId(Long custId) {
+ return ((AccWalletInfoMapper)this.baseMapper).queryAccWalletInfoVOListByCustId(custId);
+ }
+
+
+ @Override
+ public BigDecimal calculateSubsidyExpirationAmount(Long custId) {
+ List walletInfoVOList = ((AccWalletInfoMapper)this.baseMapper).queryAccWalletInfoVOListByCustId(custId);
+ BigDecimal subBalAll = (BigDecimal)walletInfoVOList.stream().map((item) -> {
+ return item.getWalletBal().add(item.getFrozenBalance());
+ }).reduce(BigDecimal.ZERO, BigDecimal::add);
+ if (subBalAll.compareTo(BigDecimal.ZERO) > 0) {
+ List detailList = this.accTradeWalletDetailService.listCustMonthAccSubsidyExpirationTrade(custId);
+ if (CollUtil.isEmpty(detailList)) {
+ return BigDecimal.ZERO;
+ } else {
+ BigDecimal rechargeAmountSum = (BigDecimal)detailList.stream().map(AccTradeWalletDetail::getAmount).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal useAmountSum = (BigDecimal)detailList.stream().map(AccTradeWalletDetail::getUseAmount).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal noUseAmount = rechargeAmountSum.subtract(useAmountSum).max(BigDecimal.ZERO);
+ return subBalAll.min(noUseAmount);
+ }
+ } else {
+ return BigDecimal.ZERO;
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java
new file mode 100644
index 00000000..19656603
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java
@@ -0,0 +1,78 @@
+package com.bonus.core.account.v3.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
+import com.bonus.constant.LeConstants;
+import com.bonus.constant.RetCodeEnum;
+import com.bonus.core.account.v3.constants.AccStatusEnum;
+import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum;
+import com.bonus.core.account.v3.web.vo.AccInfoVO;
+import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
+import com.bonus.core.common.utils.TenantContextHolder;
+import org.apache.commons.compress.utils.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+public class AccUtils {
+ private static final Logger log = LoggerFactory.getLogger(AccUtils.class);
+
+ private AccUtils() {
+ }
+
+
+ public static BigDecimal getWalletBal(List walletInfoList, Integer walletId) {
+ return (BigDecimal)walletInfoList.stream().filter((item) -> {
+ return item.getWalletId().equals(walletId);
+ }).map(AccWalletInfoVO::getWalletBal).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ }
+
+ public static BigDecimal getWalletFrozenBal(List walletInfoList, Integer walletId) {
+ return (BigDecimal)walletInfoList.stream().filter((item) -> {
+ return item.getWalletId().equals(walletId);
+ }).map(AccWalletInfoVO::getFrozenBalance).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ }
+
+ public static String getRechargeBatchNum(Integer walletId) {
+ AccWalletIdEnum anEnum = AccWalletIdEnum.getEnum(walletId);
+ String walletPrefix;
+ switch ((AccWalletIdEnum)Objects.requireNonNull(anEnum)) {
+ case WALLET:
+ walletPrefix = "w";
+ break;
+ case SUBSIDY:
+ walletPrefix = "s";
+ break;
+ case LUCK_MONEY:
+ walletPrefix = "r";
+ break;
+ default:
+ walletPrefix = "n";
+ }
+
+ String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+ return walletPrefix + date;
+ }
+
+ public static LocalDateTime nowPlusDayTime(Integer days) {
+ if (ObjectUtil.isNotNull(days) && days > 0) {
+ LocalDate plus = LocalDate.now().plusDays((long)days);
+ return plus.atTime(23, 59, 59);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccInfoDetailDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccInfoDetailDTO.java
new file mode 100644
index 00000000..67acd230
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccInfoDetailDTO.java
@@ -0,0 +1,66 @@
+package com.bonus.core.account.v3.web.dto;
+
+import cn.hutool.core.util.ObjectUtil;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+public class AccInfoDetailDTO {
+ @ApiModelProperty("人员id")
+ private @NotNull(
+ message = "{acc_single_null_custid_exception}"
+ ) Long custId;
+ @ApiModelProperty("是否查询用户卡片信息,默认查询")
+ private Boolean ifQueryCardInfoBoolean;
+
+ public Boolean getIfQueryCardInfoBoolean() {
+ return ObjectUtil.isNull(this.ifQueryCardInfoBoolean) ? Boolean.TRUE : this.ifQueryCardInfoBoolean;
+ }
+
+ public static AccInfoDetailDTOBuilder builder() {
+ return new AccInfoDetailDTOBuilder();
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setIfQueryCardInfoBoolean(final Boolean ifQueryCardInfoBoolean) {
+ this.ifQueryCardInfoBoolean = ifQueryCardInfoBoolean;
+ }
+
+ public AccInfoDetailDTO(final Long custId, final Boolean ifQueryCardInfoBoolean) {
+ this.custId = custId;
+ this.ifQueryCardInfoBoolean = ifQueryCardInfoBoolean;
+ }
+
+ public AccInfoDetailDTO() {
+ }
+
+ public static class AccInfoDetailDTOBuilder {
+ private Long custId;
+ private Boolean ifQueryCardInfoBoolean;
+
+ AccInfoDetailDTOBuilder() {
+ }
+
+ public AccInfoDetailDTOBuilder custId(final Long custId) {
+ this.custId = custId;
+ return this;
+ }
+
+ public AccInfoDetailDTOBuilder ifQueryCardInfoBoolean(final Boolean ifQueryCardInfoBoolean) {
+ this.ifQueryCardInfoBoolean = ifQueryCardInfoBoolean;
+ return this;
+ }
+
+ public AccInfoDetailDTO build() {
+ return new AccInfoDetailDTO(this.custId, this.ifQueryCardInfoBoolean);
+ }
+
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccInfoVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccInfoVO.java
new file mode 100644
index 00000000..1ee32c1e
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccInfoVO.java
@@ -0,0 +1,200 @@
+package com.bonus.core.account.v3.web.vo;
+
+
+import com.bonus.core.account.v3.constants.AccStatusEnum;
+import com.bonus.core.common.encrypt.LeNiuDecryptDataProcess;
+import com.bonus.core.common.encrypt.LeNiuDecryptField;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@LeNiuDecryptDataProcess
+public class AccInfoVO {
+ private Long id;
+ private Long custId;
+ private Long accId;
+ private String custThirdId;
+ private String custNum;
+ @LeNiuDecryptField
+ private String custName;
+ @LeNiuDecryptField
+ private String mobile;
+ private Long orgId;
+ private String orgFullName;
+ private Integer psnType;
+ private String psnTypeName;
+ private LocalDate endDate;
+ private Integer accStatus;
+ private BigDecimal accBalTotal;
+ private BigDecimal accAllBal;
+ private BigDecimal accFreezeBalTotal;
+ private List walletInfoList;
+ private String serialNum;
+ private Integer deposit;
+ private Integer productCost;
+
+ public boolean isNormal() {
+ return AccStatusEnum.NORMAL.getKey().equals(this.accStatus);
+ }
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public String getCustThirdId() {
+ return this.custThirdId;
+ }
+
+ public String getCustNum() {
+ return this.custNum;
+ }
+
+ public String getCustName() {
+ return this.custName;
+ }
+
+ public String getMobile() {
+ return this.mobile;
+ }
+
+ public Long getOrgId() {
+ return this.orgId;
+ }
+
+ public String getOrgFullName() {
+ return this.orgFullName;
+ }
+
+ public Integer getPsnType() {
+ return this.psnType;
+ }
+
+ public String getPsnTypeName() {
+ return this.psnTypeName;
+ }
+
+ public LocalDate getEndDate() {
+ return this.endDate;
+ }
+
+ public Integer getAccStatus() {
+ return this.accStatus;
+ }
+
+ public BigDecimal getAccBalTotal() {
+ return this.accBalTotal;
+ }
+
+ public BigDecimal getAccAllBal() {
+ return this.accAllBal;
+ }
+
+ public BigDecimal getAccFreezeBalTotal() {
+ return this.accFreezeBalTotal;
+ }
+
+ public List getWalletInfoList() {
+ return this.walletInfoList;
+ }
+
+ public String getSerialNum() {
+ return this.serialNum;
+ }
+
+ public Integer getDeposit() {
+ return this.deposit;
+ }
+
+ public Integer getProductCost() {
+ return this.productCost;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setCustThirdId(final String custThirdId) {
+ this.custThirdId = custThirdId;
+ }
+
+ public void setCustNum(final String custNum) {
+ this.custNum = custNum;
+ }
+
+ public void setCustName(final String custName) {
+ this.custName = custName;
+ }
+
+ public void setMobile(final String mobile) {
+ this.mobile = mobile;
+ }
+
+ public void setOrgId(final Long orgId) {
+ this.orgId = orgId;
+ }
+
+ public void setOrgFullName(final String orgFullName) {
+ this.orgFullName = orgFullName;
+ }
+
+ public void setPsnType(final Integer psnType) {
+ this.psnType = psnType;
+ }
+
+ public void setPsnTypeName(final String psnTypeName) {
+ this.psnTypeName = psnTypeName;
+ }
+
+ public void setEndDate(final LocalDate endDate) {
+ this.endDate = endDate;
+ }
+
+ public void setAccStatus(final Integer accStatus) {
+ this.accStatus = accStatus;
+ }
+
+ public void setAccBalTotal(final BigDecimal accBalTotal) {
+ this.accBalTotal = accBalTotal;
+ }
+
+ public void setAccAllBal(final BigDecimal accAllBal) {
+ this.accAllBal = accAllBal;
+ }
+
+ public void setAccFreezeBalTotal(final BigDecimal accFreezeBalTotal) {
+ this.accFreezeBalTotal = accFreezeBalTotal;
+ }
+
+ public void setWalletInfoList(final List walletInfoList) {
+ this.walletInfoList = walletInfoList;
+ }
+
+ public void setSerialNum(final String serialNum) {
+ this.serialNum = serialNum;
+ }
+
+ public void setDeposit(final Integer deposit) {
+ this.deposit = deposit;
+ }
+
+ public void setProductCost(final Integer productCost) {
+ this.productCost = productCost;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccWalletInfoVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccWalletInfoVO.java
new file mode 100644
index 00000000..7a1b9281
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/vo/AccWalletInfoVO.java
@@ -0,0 +1,79 @@
+package com.bonus.core.account.v3.web.vo;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+public class AccWalletInfoVO {
+ private Long custId;
+ private Long accId;
+ private Integer walletId;
+ private BigDecimal walletBal;
+ private BigDecimal limitBalance;
+ private BigDecimal frozenBalance;
+ private BigDecimal lastSubsidyAmount;
+ private LocalDateTime lastSubsidyTime;
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public Integer getWalletId() {
+ return this.walletId;
+ }
+
+ public BigDecimal getWalletBal() {
+ return this.walletBal;
+ }
+
+ public BigDecimal getLimitBalance() {
+ return this.limitBalance;
+ }
+
+ public BigDecimal getFrozenBalance() {
+ return this.frozenBalance;
+ }
+
+ public BigDecimal getLastSubsidyAmount() {
+ return this.lastSubsidyAmount;
+ }
+
+ public LocalDateTime getLastSubsidyTime() {
+ return this.lastSubsidyTime;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setWalletId(final Integer walletId) {
+ this.walletId = walletId;
+ }
+
+ public void setWalletBal(final BigDecimal walletBal) {
+ this.walletBal = walletBal;
+ }
+
+ public void setLimitBalance(final BigDecimal limitBalance) {
+ this.limitBalance = limitBalance;
+ }
+
+ public void setFrozenBalance(final BigDecimal frozenBalance) {
+ this.frozenBalance = frozenBalance;
+ }
+
+ public void setLastSubsidyAmount(final BigDecimal lastSubsidyAmount) {
+ this.lastSubsidyAmount = lastSubsidyAmount;
+ }
+
+ public void setLastSubsidyTime(final LocalDateTime lastSubsidyTime) {
+ this.lastSubsidyTime = lastSubsidyTime;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/api/CardInfoServiceV4Api.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/api/CardInfoServiceV4Api.java
new file mode 100644
index 00000000..ce8aa975
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/api/CardInfoServiceV4Api.java
@@ -0,0 +1,35 @@
+package com.bonus.core.account.v4.api;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.bonus.core.account.v4.constant.CardStatusEnum;
+import com.bonus.core.account.v4.web.model.AccCard;
+import com.bonus.core.account.v4.web.service.CardInfoV4Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CardInfoServiceV4Api {
+ @Autowired
+ @Lazy
+ private CardInfoV4Service cardInfoService;
+
+ public AccCard queryOneCardInfoByCustId(Long custId) {
+ List accCards = this.queryCardInfoByCustIdOrSerialNum(custId, (String) null);
+ return CollUtil.isNotEmpty(accCards) ? (AccCard) accCards.get(0) : null;
+ }
+
+ public List queryCardInfoByCustIdOrSerialNum(Long custId, String serialNum) {
+ return this.cardInfoService.list(Wrappers.lambdaQuery(AccCard.class)
+ .eq(ObjectUtil.isNotNull(custId), AccCard::getCustId, custId)
+ .eq(ObjectUtil.isNotNull(serialNum), AccCard::getSerialNum, serialNum)
+ .in(AccCard::getCardStatus, CardStatusEnum.normalAndLoss())
+ .orderByDesc(AccCard::getUptime));
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/controller/AppAccV4Controller.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/controller/AppAccV4Controller.java
new file mode 100644
index 00000000..a4c0dc02
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/controller/AppAccV4Controller.java
@@ -0,0 +1,48 @@
+package com.bonus.core.account.v4.app.controller;
+
+import com.bonus.common.core.web.controller.BaseController;
+import com.bonus.common.core.web.domain.AjaxResult;
+import com.bonus.core.account.v4.app.dto.AppAccInfoV4DTO;
+import com.bonus.core.account.v4.app.service.impl.AppAccV4Service;
+import com.bonus.core.account.v4.app.vo.AppAccInfoV4VO;
+import com.bonus.core.account.v4.app.vo.AppWalletBalanceVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.Map;
+
+@RestController
+@RequestMapping({"/api/v4/app/account"})
+@Api(
+ value = "账户管理/移动端/v4",
+ tags = {"账户管理/移动端/v4"}
+)
+public class AppAccV4Controller extends BaseController {
+ private static final Logger log = LoggerFactory.getLogger(AppAccV4Controller.class);
+ @Resource
+ private AppAccV4Service appAccV4Service;
+
+ @ApiOperation(
+ value = "查询账户(仅返回钱包余额)",
+ notes = "移动端查询账户(仅返回钱包余额)"
+ )
+ @PostMapping({"/wallet/balance"})
+ public AjaxResult queryWalletBalance(@RequestBody AppAccInfoV4DTO o) {
+ return success(this.appAccV4Service.queryWalletBalance(o));
+ }
+
+ @ApiOperation(
+ value = "查询账户(基础信息+余额)",
+ notes = "移动端查询账户(基础信息+余额)"
+ )
+ @PostMapping({"/info"})
+ public AjaxResult queryAccInfoForApp(@RequestBody AppAccInfoV4DTO o) {
+ return success(this.appAccV4Service.queryAccInfoForApp(o));
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/dto/AppAccInfoV4DTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/dto/AppAccInfoV4DTO.java
new file mode 100644
index 00000000..26860dfd
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/dto/AppAccInfoV4DTO.java
@@ -0,0 +1,15 @@
+package com.bonus.core.account.v4.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+@Data
+public class AppAccInfoV4DTO {
+ @ApiModelProperty("人员Id")
+ private @NotNull(message = "{acc_single_null_custid_exception}") Long custId;
+ @ApiModelProperty(value = "openid", hidden = true)
+ private String openid;
+ @ApiModelProperty(value = "来源类型 1-微信小程序 2-微信公众号 3-企业微信 5-支付宝 7-h5 9-钉钉", hidden = true)
+ private Integer sourceType;
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/AppWorkV4Service.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/AppWorkV4Service.java
new file mode 100644
index 00000000..9ce3225e
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/AppWorkV4Service.java
@@ -0,0 +1,5 @@
+package com.bonus.core.account.v4.app.service;
+
+
+public interface AppWorkV4Service {
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppAccV4Service.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppAccV4Service.java
new file mode 100644
index 00000000..b7e6a1e7
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppAccV4Service.java
@@ -0,0 +1,65 @@
+package com.bonus.core.account.v4.app.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.account.v3.custom.AccForAppCustomBusiness;
+import com.bonus.core.account.v3.service.AccInfoService;
+import com.bonus.core.account.v3.service.AccWalletInfoService;
+import com.bonus.core.account.v3.web.dto.AccInfoDetailDTO;
+import com.bonus.core.account.v4.app.dto.AppAccInfoV4DTO;
+import com.bonus.core.account.v4.app.vo.AppAccInfoV4VO;
+import com.bonus.core.account.v4.app.vo.AppWalletBalanceVO;
+import com.github.pagehelper.page.PageMethod;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class AppAccV4Service {
+ private static final Logger log = LoggerFactory.getLogger(AppAccV4Service.class);
+ @Resource
+ @Lazy
+ private AccInfoService accInfoService;
+ @Resource
+ @Lazy
+ private AccForAppCustomBusiness accForAppCustomBusiness;
+ @Resource
+ @Lazy
+ private AccWalletInfoService accWalletInfoService;
+
+ public AppWalletBalanceVO queryWalletBalance(AppAccInfoV4DTO appAccInfoV4DTO) {
+ log.info("[app]v4查询账户余额入参={}", JSONUtil.toJsonStr(appAccInfoV4DTO));
+ AccInfoDetailVO accInfoDetailVO = this.accInfoService.getAccInfoDetail(AccInfoDetailDTO.builder().custId(appAccInfoV4DTO.getCustId()).ifQueryCardInfoBoolean(Boolean.FALSE).build());
+ AppWalletBalanceVO walletBalanceVO = AppWalletBalanceVO.of(accInfoDetailVO);
+ log.info("[app]v4查询账户余额入参={}", JSONUtil.toJsonStr(walletBalanceVO));
+ return walletBalanceVO;
+ }
+
+ public AppAccInfoV4VO queryAccInfoForApp(AppAccInfoV4DTO appAccInfoV4DTO) {
+ log.info("[app]v4查询账户信息入参={}", JSONUtil.toJsonStr(appAccInfoV4DTO));
+ AccInfoDetailVO accInfoDetailVO = this.accInfoService.getAccInfoDetail(AccInfoDetailDTO.builder().custId(appAccInfoV4DTO.getCustId()).ifQueryCardInfoBoolean(Boolean.FALSE).build());
+ AppAccInfoV4VO appAccInfoV4VO = AppAccInfoV4VO.of(accInfoDetailVO);
+ appAccInfoV4VO.setSubsidyExpirationToast(this.calculateSubsidyExpirationAmount(appAccInfoV4VO.getCustId()));
+ this.accForAppCustomBusiness.didGetAccInfoDetailV4(appAccInfoV4DTO, appAccInfoV4VO);
+ log.info("[app]v4查询账户信息结果vo={}", JSONUtil.toJsonStr(appAccInfoV4VO));
+ return appAccInfoV4VO;
+ }
+
+ protected String calculateSubsidyExpirationAmount(Long custId) {
+ BigDecimal amountFen = this.accWalletInfoService.calculateSubsidyExpirationAmount(custId);
+ if (amountFen.compareTo(BigDecimal.ZERO) > 0) {
+ BigDecimal amountYuan = amountFen.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+ return "本月¥" + String.valueOf(amountYuan) + "补贴即将过期";
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppWorkV4ServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppWorkV4ServiceImpl.java
new file mode 100644
index 00000000..8fb1795f
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/service/impl/AppWorkV4ServiceImpl.java
@@ -0,0 +1,11 @@
+package com.bonus.core.account.v4.app.service.impl;
+
+import com.bonus.core.account.v4.app.service.AppWorkV4Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppWorkV4ServiceImpl implements AppWorkV4Service {
+ private static final Logger log = LoggerFactory.getLogger(AppWorkV4ServiceImpl.class);
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppAccInfoV4VO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppAccInfoV4VO.java
new file mode 100644
index 00000000..27cd184e
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppAccInfoV4VO.java
@@ -0,0 +1,68 @@
+package com.bonus.core.account.v4.app.vo;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import com.bonus.core.common.encrypt.LeNiuDecryptField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class AppAccInfoV4VO {
+ @ApiModelProperty("人员id")
+ private Long custId;
+ @ApiModelProperty("人员姓名")
+ @LeNiuDecryptField
+ private String custName;
+ @ApiModelProperty("账户Id")
+ private Long accId;
+ @ApiModelProperty("第三方人员Id")
+ private String custThirdId;
+ @ApiModelProperty("组织id")
+ private Long orgId;
+ @ApiModelProperty("人员类别")
+ private Integer psnType;
+ @ApiModelProperty("账户状态 1正常 2冻结 3销户 4过期")
+ private Integer accStatus;
+ @ApiModelProperty("个人钱包(可用)余额/分")
+ private BigDecimal walletBal;
+ @ApiModelProperty("补贴钱包(可用)余额/分")
+ private BigDecimal subsidyBal;
+ @ApiModelProperty("红包(可用)余额")
+ private BigDecimal redEnvelope;
+ @ApiModelProperty("补贴钱包总金额(可用+冻结)")
+ private BigDecimal subBalTotal;
+ @ApiModelProperty("个人钱包冻结金额")
+ private BigDecimal walletFreezeBal;
+ @ApiModelProperty("补贴钱包冻结金额")
+ private BigDecimal subFreezeBal;
+ @ApiModelProperty("总冻结金额")
+ private BigDecimal accFreezeBalTotal;
+ @ApiModelProperty("账户总余额(包含冻结金额)")
+ private BigDecimal accAllBal;
+ @ApiModelProperty("账户可用余额总余额(不包括冻结金额)")
+ private BigDecimal accBalTotal;
+ @ApiModelProperty("补贴过期即将过期提示")
+ private String subsidyExpirationToast;
+
+ public static AppAccInfoV4VO of(AccInfoDetailVO accInfoDetailVO) {
+ AppAccInfoV4VO appAccInfoV4VO = new AppAccInfoV4VO();
+ appAccInfoV4VO.setCustId(accInfoDetailVO.getCustId());
+ appAccInfoV4VO.setCustName(accInfoDetailVO.getCustName());
+ appAccInfoV4VO.setAccId(accInfoDetailVO.getAccId());
+ appAccInfoV4VO.setCustThirdId(accInfoDetailVO.getCustThirdId());
+ appAccInfoV4VO.setOrgId(accInfoDetailVO.getOrgId());
+ appAccInfoV4VO.setPsnType(accInfoDetailVO.getPsnType());
+ appAccInfoV4VO.setAccBalTotal(accInfoDetailVO.getAccBalTotal());
+ appAccInfoV4VO.setAccAllBal(accInfoDetailVO.getAccAllBal());
+ appAccInfoV4VO.setWalletBal(accInfoDetailVO.getWalletBal());
+ appAccInfoV4VO.setSubsidyBal(accInfoDetailVO.getSubsidyBal());
+ appAccInfoV4VO.setRedEnvelope(accInfoDetailVO.getRedEnvelope());
+ appAccInfoV4VO.setWalletFreezeBal(accInfoDetailVO.getWalletFreezeBal());
+ appAccInfoV4VO.setSubFreezeBal(accInfoDetailVO.getSubFreezeBal());
+ appAccInfoV4VO.setAccFreezeBalTotal(accInfoDetailVO.getAccFreezeBalTotal());
+ appAccInfoV4VO.setAccStatus(accInfoDetailVO.getAccStatus());
+ appAccInfoV4VO.setSubBalTotal(accInfoDetailVO.getSubsidyBal().add(accInfoDetailVO.getSubFreezeBal()));
+ return appAccInfoV4VO;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppWalletBalanceVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppWalletBalanceVO.java
new file mode 100644
index 00000000..06e036e8
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/app/vo/AppWalletBalanceVO.java
@@ -0,0 +1,43 @@
+package com.bonus.core.account.v4.app.vo;
+
+import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class AppWalletBalanceVO {
+ @ApiModelProperty("个人钱包余额/分")
+ private BigDecimal walletBal;
+ @ApiModelProperty("补贴钱包余额/分")
+ private BigDecimal subsidyBal;
+ @ApiModelProperty("红包余额")
+ private BigDecimal redEnvelope;
+ @ApiModelProperty("个人钱包冻结金额")
+ private BigDecimal walletFreezeBal;
+ @ApiModelProperty("补贴钱包冻结金额")
+ private BigDecimal subFreezeBal;
+ @ApiModelProperty("冻结金额")
+ private BigDecimal accFreezeBalTotal;
+ @ApiModelProperty("账户总余额(包含冻结金额)")
+ private BigDecimal accAllBal;
+ @ApiModelProperty("账户可用余额总余额(不包括冻结金额)")
+ private BigDecimal accBalTotal;
+ @ApiModelProperty("账户状态 1正常 2冻结 3销户 4过期")
+ private Integer accStatus;
+
+
+ public static AppWalletBalanceVO of(AccInfoDetailVO accInfoDetailVO) {
+ AppWalletBalanceVO walletBalanceVO = new AppWalletBalanceVO();
+ walletBalanceVO.setAccBalTotal(accInfoDetailVO.getAccBalTotal());
+ walletBalanceVO.setAccAllBal(accInfoDetailVO.getAccAllBal());
+ walletBalanceVO.setWalletBal(accInfoDetailVO.getWalletBal());
+ walletBalanceVO.setSubsidyBal(accInfoDetailVO.getSubsidyBal());
+ walletBalanceVO.setRedEnvelope(accInfoDetailVO.getRedEnvelope());
+ walletBalanceVO.setWalletFreezeBal(accInfoDetailVO.getWalletFreezeBal());
+ walletBalanceVO.setSubFreezeBal(accInfoDetailVO.getSubFreezeBal());
+ walletBalanceVO.setAccFreezeBalTotal(accInfoDetailVO.getAccFreezeBalTotal());
+ walletBalanceVO.setAccStatus(accInfoDetailVO.getAccStatus());
+ return walletBalanceVO;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/constant/CardStatusEnum.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/constant/CardStatusEnum.java
new file mode 100644
index 00000000..d4551a6b
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/constant/CardStatusEnum.java
@@ -0,0 +1,63 @@
+package com.bonus.core.account.v4.constant;
+
+
+import com.bonus.core.common.converter.LeExcelFieldConvertor;
+import com.bonus.core.common.converter.LeExcelFieldEnum;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum CardStatusEnum implements LeExcelFieldEnum {
+ NORMAL(1, "正常"),
+ LOSS(4, "挂失"),
+ APPLY(5, "发卡"),
+ REFUND(6, "退卡"),
+ EXPIRED(7, "已过期");
+
+ private final Integer key;
+ private final String desc;
+
+ private CardStatusEnum(Integer key, String desc) {
+ this.key = key;
+ this.desc = desc;
+ }
+
+ public static String getDesc(Integer key) {
+ CardStatusEnum[] var1 = values();
+ int var2 = var1.length;
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ CardStatusEnum temp = var1[var3];
+ if (temp.getKey().equals(key)) {
+ return temp.getDesc();
+ }
+ }
+
+ return "";
+ }
+
+ public static List normalAndLoss() {
+ return Arrays.asList(NORMAL.getKey(), LOSS.getKey());
+ }
+
+ @Override
+ public Integer getKey() {
+ return this.key;
+ }
+
+ @Override
+ public String getDesc() {
+ return this.desc;
+ }
+
+ // $FF: synthetic method
+ private static CardStatusEnum[] $values() {
+ return new CardStatusEnum[]{NORMAL, LOSS, APPLY, REFUND, EXPIRED};
+ }
+
+ public static class ExcelConvertor extends LeExcelFieldConvertor {
+ public ExcelConvertor() {
+ super(CardStatusEnum.class);
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.java
new file mode 100644
index 00000000..4a050660
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.java
@@ -0,0 +1,15 @@
+package com.bonus.core.account.v4.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bonus.core.account.v4.web.model.AccCard;
+import com.bonus.core.account.vo.AccCardBaseInfoVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface AccCardMapper extends BaseMapper {
+ @Select({"SELECT ci.cust_num, ac.serial_num FROM acc_card ac LEFT JOIN cust_info ci ON ac.cust_id = ci.cust_id where ac.card_status in (1,4)"})
+ List listAccCardBaseInfo();
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.xml
new file mode 100644
index 00000000..51cd3006
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/mapper/AccCardMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/model/AccCard.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/model/AccCard.java
new file mode 100644
index 00000000..57a1c660
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/model/AccCard.java
@@ -0,0 +1,265 @@
+package com.bonus.core.account.v4.web.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@TableName("acc_card")
+@ApiModel("人员卡片资料表")
+public class AccCard extends Model {
+ private static final long serialVersionUID = 1L;
+ @TableId
+ @ApiModelProperty("主键自增")
+ private Long id;
+ @ApiModelProperty("人员id")
+ private Long custId;
+ @ApiModelProperty("账户id")
+ private Long accId;
+ @ApiModelProperty("卡号")
+ private Integer cardNum;
+ @ApiModelProperty("卡序列号")
+ private String serialNum;
+ @ApiModelProperty("卡类型")
+ private Integer cardType;
+ @ApiModelProperty("卡状态 1-正常 4-挂失")
+ private Integer cardStatus;
+ @ApiModelProperty("押金 单位分")
+ private Integer deposit;
+ @ApiModelProperty("工本费 单位分")
+ private Integer productCost;
+ @ApiModelProperty("待缴工本费金额 单位分")
+ private Integer pendProductCost;
+ @ApiModelProperty("卡片有效期")
+ private LocalDate validityDate;
+ @ApiModelProperty("预留字段1")
+ private String reserved1;
+ @ApiModelProperty("预留字段2")
+ private String reserved2;
+ @ApiModelProperty("预留字段3")
+ private String reserved3;
+ @ApiModelProperty("乐观锁")
+ private Integer revision;
+ @TableField(
+ value = "crby",
+ fill = FieldFill.INSERT
+ )
+ @ApiModelProperty("创建人")
+ private String crby;
+ @ApiModelProperty("创建时间")
+ @TableField(
+ value = "crtime",
+ fill = FieldFill.INSERT
+ )
+ private LocalDateTime crtime;
+ @TableField(
+ value = "upby",
+ fill = FieldFill.UPDATE
+ )
+ @ApiModelProperty("更新人")
+ private String upby;
+ @ApiModelProperty("更新时间")
+ @TableField(
+ value = "uptime",
+ fill = FieldFill.UPDATE
+ )
+ private LocalDateTime uptime;
+ @ApiModelProperty("三方卡号")
+ private String thirdSerialNum;
+ @ApiModelProperty("备注")
+ private String remark;
+ @ApiModelProperty("卡面号")
+ private String cardFaceNum;
+ @ApiModelProperty("发卡来源")
+ private String cardSourceType;
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public Long getCustId() {
+ return this.custId;
+ }
+
+ public Long getAccId() {
+ return this.accId;
+ }
+
+ public Integer getCardNum() {
+ return this.cardNum;
+ }
+
+ public String getSerialNum() {
+ return this.serialNum;
+ }
+
+ public Integer getCardType() {
+ return this.cardType;
+ }
+
+ public Integer getCardStatus() {
+ return this.cardStatus;
+ }
+
+ public Integer getDeposit() {
+ return this.deposit;
+ }
+
+ public Integer getProductCost() {
+ return this.productCost;
+ }
+
+ public Integer getPendProductCost() {
+ return this.pendProductCost;
+ }
+
+ public LocalDate getValidityDate() {
+ return this.validityDate;
+ }
+
+ public String getReserved1() {
+ return this.reserved1;
+ }
+
+ public String getReserved2() {
+ return this.reserved2;
+ }
+
+ public String getReserved3() {
+ return this.reserved3;
+ }
+
+ public Integer getRevision() {
+ return this.revision;
+ }
+
+ public String getCrby() {
+ return this.crby;
+ }
+
+ public LocalDateTime getCrtime() {
+ return this.crtime;
+ }
+
+ public String getUpby() {
+ return this.upby;
+ }
+
+ public LocalDateTime getUptime() {
+ return this.uptime;
+ }
+
+ public String getThirdSerialNum() {
+ return this.thirdSerialNum;
+ }
+
+ public String getRemark() {
+ return this.remark;
+ }
+
+ public String getCardFaceNum() {
+ return this.cardFaceNum;
+ }
+
+ public String getCardSourceType() {
+ return this.cardSourceType;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public void setCustId(final Long custId) {
+ this.custId = custId;
+ }
+
+ public void setAccId(final Long accId) {
+ this.accId = accId;
+ }
+
+ public void setCardNum(final Integer cardNum) {
+ this.cardNum = cardNum;
+ }
+
+ public void setSerialNum(final String serialNum) {
+ this.serialNum = serialNum;
+ }
+
+ public void setCardType(final Integer cardType) {
+ this.cardType = cardType;
+ }
+
+ public void setCardStatus(final Integer cardStatus) {
+ this.cardStatus = cardStatus;
+ }
+
+ public void setDeposit(final Integer deposit) {
+ this.deposit = deposit;
+ }
+
+ public void setProductCost(final Integer productCost) {
+ this.productCost = productCost;
+ }
+
+ public void setPendProductCost(final Integer pendProductCost) {
+ this.pendProductCost = pendProductCost;
+ }
+
+ public void setValidityDate(final LocalDate validityDate) {
+ this.validityDate = validityDate;
+ }
+
+ public void setReserved1(final String reserved1) {
+ this.reserved1 = reserved1;
+ }
+
+ public void setReserved2(final String reserved2) {
+ this.reserved2 = reserved2;
+ }
+
+ public void setReserved3(final String reserved3) {
+ this.reserved3 = reserved3;
+ }
+
+ public void setRevision(final Integer revision) {
+ this.revision = revision;
+ }
+
+ public void setCrby(final String crby) {
+ this.crby = crby;
+ }
+
+ public void setCrtime(final LocalDateTime crtime) {
+ this.crtime = crtime;
+ }
+
+ public void setUpby(final String upby) {
+ this.upby = upby;
+ }
+
+ public void setUptime(final LocalDateTime uptime) {
+ this.uptime = uptime;
+ }
+
+ public void setThirdSerialNum(final String thirdSerialNum) {
+ this.thirdSerialNum = thirdSerialNum;
+ }
+
+ public void setRemark(final String remark) {
+ this.remark = remark;
+ }
+
+ public void setCardFaceNum(final String cardFaceNum) {
+ this.cardFaceNum = cardFaceNum;
+ }
+
+ public void setCardSourceType(final String cardSourceType) {
+ this.cardSourceType = cardSourceType;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/service/CardInfoV4Service.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/service/CardInfoV4Service.java
new file mode 100644
index 00000000..1642705c
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v4/web/service/CardInfoV4Service.java
@@ -0,0 +1,10 @@
+package com.bonus.core.account.v4.web.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bonus.core.account.v4.web.mapper.AccCardMapper;
+import com.bonus.core.account.v4.web.model.AccCard;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CardInfoV4Service extends ServiceImpl {
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/vo/AccCardBaseInfoVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/vo/AccCardBaseInfoVO.java
new file mode 100644
index 00000000..4d668348
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/vo/AccCardBaseInfoVO.java
@@ -0,0 +1,26 @@
+package com.bonus.core.account.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class AccCardBaseInfoVO {
+ @ApiModelProperty("人员编号")
+ private String custNum;
+ @ApiModelProperty("卡序列号")
+ private String serialNum;
+
+ public String getCustNum() {
+ return this.custNum;
+ }
+
+ public String getSerialNum() {
+ return this.serialNum;
+ }
+
+ public void setCustNum(final String custNum) {
+ this.custNum = custNum;
+ }
+
+ public void setSerialNum(final String serialNum) {
+ this.serialNum = serialNum;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/alloc/model/DataManageMetadataModel.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/alloc/model/DataManageMetadataModel.java
new file mode 100644
index 00000000..ce993f64
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/alloc/model/DataManageMetadataModel.java
@@ -0,0 +1,12 @@
+package com.bonus.core.allocation.alloc.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("数据管理配置项")
+@Data
+public class DataManageMetadataModel {
+ @ApiModelProperty("手机号脱敏")
+ private String phoneDesensitization = "1";
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldConvertor.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldConvertor.java
new file mode 100644
index 00000000..e0d1bd3a
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldConvertor.java
@@ -0,0 +1,52 @@
+package com.bonus.core.common.converter;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.util.Objects;
+
+public abstract class LeExcelFieldConvertor> implements Converter {
+ private final Class clz;
+
+ protected LeExcelFieldConvertor(Class clz) {
+ this.clz = clz;
+ }
+
+ @Override
+ public Class> supportJavaTypeKey() {
+ return String.class;
+ }
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ return null;
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+ if (Objects.isNull(value)) {
+ return new WriteCellData("");
+ } else {
+ String desc = "";
+ T[] enumConstants = (T[]) this.clz.getEnumConstants();
+ if (enumConstants != null) {
+ LeExcelFieldEnum[] var6 = enumConstants;
+ int var7 = enumConstants.length;
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ T t = (T) var6[var8];
+ if (ObjectUtil.equals(value, t.getKey())) {
+ desc = t.getDesc();
+ break;
+ }
+ }
+ }
+
+ return new WriteCellData(desc);
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldEnum.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldEnum.java
new file mode 100644
index 00000000..3dfd762f
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/converter/LeExcelFieldEnum.java
@@ -0,0 +1,11 @@
+package com.bonus.core.common.converter;
+
+public interface LeExcelFieldEnum> {
+ default Integer getKey() {
+ return null;
+ }
+
+ default String getDesc() {
+ return null;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/custom/business/CustomBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/custom/business/CustomBusiness.java
new file mode 100644
index 00000000..9ae27c0b
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/custom/business/CustomBusiness.java
@@ -0,0 +1,49 @@
+package com.bonus.core.common.custom.business;
+
+import cn.hutool.core.collection.CollUtil;
+
+import java.util.List;
+
+public interface CustomBusiness {
+ default String name() {
+ return "订单定制业务";
+ }
+
+ default List versions() {
+ return CollUtil.newArrayList(new Version[0]);
+ }
+
+ default Version customVersion() {
+ return null;
+ }
+
+ public static class Version {
+ private String code;
+ private String desc;
+
+ public String getCode() {
+ return this.code;
+ }
+
+ public String getDesc() {
+ return this.desc;
+ }
+
+ public void setCode(final String code) {
+ this.code = code;
+ }
+
+ public void setDesc(final String desc) {
+ this.desc = desc;
+ }
+
+ private Version(final String code, final String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static Version of(final String code, final String desc) {
+ return new Version(code, desc);
+ }
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/HandleType.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/HandleType.java
new file mode 100644
index 00000000..2802d76e
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/HandleType.java
@@ -0,0 +1,15 @@
+package com.bonus.core.common.encrypt;
+
+public enum HandleType {
+ DECRYPT,
+ DESENSITIZE_MOBILE_PHONE,
+ DESENSITIZE_ID_CARD,
+ DESENSITIZE_CHINESE_NAME,
+ DESENSITIZE_EMAIL,
+ DESENSITIZE_ADDRESS;
+
+ // $FF: synthetic method
+ private static HandleType[] $values() {
+ return new HandleType[]{DECRYPT, DESENSITIZE_MOBILE_PHONE, DESENSITIZE_ID_CARD, DESENSITIZE_CHINESE_NAME, DESENSITIZE_EMAIL, DESENSITIZE_ADDRESS};
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDataHandler.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDataHandler.java
new file mode 100644
index 00000000..e128e056
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDataHandler.java
@@ -0,0 +1,86 @@
+package com.bonus.core.common.encrypt;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import cn.hutool.core.util.DesensitizedUtil.DesensitizedType;
+import com.bonus.core.allocation.alloc.model.DataManageMetadataModel;
+import com.bonus.core.allocation.api.AllocMetadataApi;
+import com.bonus.core.common.enums.MetadataModelTypeEnum;
+import com.bonus.utils.SM4EncryptUtils;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.page.PageMethod;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Component
+public class LeNiuDataHandler {
+ @Autowired
+ @Lazy
+ private AllocMetadataApi allocMetadataApi;
+
+ public T resultProcess(T result) throws IllegalAccessException {
+ Class> resultClass = result.getClass();
+ Class> superclass = resultClass.getSuperclass();
+ Field[] declaredFields = resultClass.getDeclaredFields();
+ Field[] superFields = superclass.getDeclaredFields();
+ Field[] allFields = (Field[])Stream.concat(Arrays.stream(declaredFields), Arrays.stream(superFields)).toArray((x$0) -> {
+ return new Field[x$0];
+ });
+ Set decryptField = this.getProcessField(allFields);
+ Page localPage = PageMethod.getLocalPage();
+ PageMethod.clearPage();
+ DataManageMetadataModel metadata = (DataManageMetadataModel)this.allocMetadataApi.queryMetadataModel(MetadataModelTypeEnum.MERCHANT, new DataManageMetadataModel());
+ if (Objects.nonNull(localPage)) {
+ PageMethod.setLocalPage(localPage);
+ }
+
+ Iterator var10 = decryptField.iterator();
+
+ while(var10.hasNext()) {
+ Field field = (Field)var10.next();
+ Object object = field.get(result);
+ if (object instanceof String) {
+ String dbValue = (String) object;
+ String decrypted;
+ if (((LeNiuDecryptField)field.getAnnotation(LeNiuDecryptField.class)).value().equals(HandleType.DECRYPT)) {
+ decrypted = SM4EncryptUtils.sm4Decrypt(dbValue);
+ field.set(result, decrypted);
+ } else {
+ decrypted = SM4EncryptUtils.sm4Decrypt(dbValue);
+ if (metadata != null && "1".equals(metadata.getPhoneDesensitization())) {
+ String name = ((LeNiuDecryptField)field.getAnnotation(LeNiuDecryptField.class)).value().name();
+ String type = name.replace("DESENSITIZE_", "");
+ DesensitizedType desensitizedType = DesensitizedType.valueOf(type);
+ decrypted = DesensitizedUtil.desensitized(decrypted, desensitizedType);
+ }
+
+ field.set(result, decrypted);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ protected Set getProcessField(Field[] declaredFields) {
+ Set fieldSet = (Set)Arrays.stream(declaredFields).filter((fieldx) -> {
+ return fieldx.isAnnotationPresent(LeNiuDecryptField.class) && fieldx.getType() == String.class;
+ }).collect(Collectors.toSet());
+ Iterator var3 = fieldSet.iterator();
+
+ while(var3.hasNext()) {
+ Field field = (Field)var3.next();
+ field.setAccessible(true);
+ }
+
+ return fieldSet;
+ }
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptDataProcess.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptDataProcess.java
new file mode 100644
index 00000000..a6ca4faa
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptDataProcess.java
@@ -0,0 +1,10 @@
+package com.bonus.core.common.encrypt;
+
+import java.lang.annotation.*;
+
+@Inherited
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LeNiuDecryptDataProcess {
+ Class decryptionMode() default LeNiuDataHandler.class;
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptField.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptField.java
new file mode 100644
index 00000000..b4fdbdae
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/encrypt/LeNiuDecryptField.java
@@ -0,0 +1,10 @@
+package com.bonus.core.common.encrypt;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface LeNiuDecryptField {
+ HandleType value() default HandleType.DECRYPT;
+}
diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/alloc/mapper/AllocPayMetadataMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/alloc/AllocPayMetadataMapper.xml
similarity index 100%
rename from bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/alloc/mapper/AllocPayMetadataMapper.xml
rename to bonus-modules/bonus-smart-canteen/src/main/resources/mapper/alloc/AllocPayMetadataMapper.xml
diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccInfoMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccInfoMapper.xml
new file mode 100644
index 00000000..c25d7e1f
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccInfoMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeWalletDetailMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeWalletDetailMapper.xml
new file mode 100644
index 00000000..7d774bc0
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeWalletDetailMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccWalletInfoMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccWalletInfoMapper.xml
new file mode 100644
index 00000000..f2400296
--- /dev/null
+++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccWalletInfoMapper.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+