commit f2905da970e609999751e4c69591d8da80658280 Author: Anlin <184993826@qq.com> Date: Tue Jun 3 09:47:10 2025 +0800 first commit diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml new file mode 100644 index 0000000..0c9e788 --- /dev/null +++ b/ruoyi-api/pom.xml @@ -0,0 +1,27 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-api-bom + ruoyi-api-system + ruoyi-api-resource + ruoyi-api-payment + ruoyi-api-settlement + ruoyi-api-mp + + + ruoyi-api + pom + + + ruoyi-api系统接口 + + + diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml new file mode 100644 index 0000000..b380adb --- /dev/null +++ b/ruoyi-api/ruoyi-api-bom/pom.xml @@ -0,0 +1,57 @@ + + + + 4.0.0 + + org.dromara + ruoyi-api-bom + pom + ${revision} + + + ruoyi-api-bom api依赖项 + + + + 2.1.2 + + + + + + + org.dromara + ruoyi-api-system + ${revision} + + + + + org.dromara + ruoyi-api-resource + ${revision} + + + + org.dromara + ruoyi-api-payment + ${revision} + + + + org.dromara + ruoyi-api-settlement + ${revision} + + + + org.dromara + ruoyi-api-mp + ${revision} + + + + + diff --git a/ruoyi-api/ruoyi-api-mp/pom.xml b/ruoyi-api/ruoyi-api-mp/pom.xml new file mode 100644 index 0000000..101d184 --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.dromara + ruoyi-api + ${revision} + + + ruoyi-api-mp + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java new file mode 100644 index 0000000..819810b --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java @@ -0,0 +1,29 @@ +package org.dromara.map.api; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteSysDomainService + * @description + * @create 2024-04-07 16:41 + */ +public interface RemoteSysDomainService { + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:35 + * 说明:获取短信配置 + **/ + + Map selSmsConfig(String domainCode); + + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java new file mode 100644 index 0000000..1f2d5ed --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java @@ -0,0 +1,26 @@ +package org.dromara.map.api; + +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWokerService + * @description + * @create 2024-03-29 10:55 + */ +public interface RemoteUserWokerService { + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-01 11:33 + * 说明:根据手机号、租户ID,查询自雇者 + **/ + public LoginMpUser selectUserWorkByPhonenumer(String phonenumber, String tenantId); + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java new file mode 100644 index 0000000..5665a8c --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java @@ -0,0 +1,186 @@ +package org.dromara.map.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteUserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Integer isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java new file mode 100644 index 0000000..39ea631 --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java @@ -0,0 +1,156 @@ +package org.dromara.map.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +public class LoginMpUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String name; + + /** + * 密码 + */ + private String password; + + + + /** + * 当前角色id + */ + private Long curRoleId; + + /** + * 当前角色名称 + */ + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Integer busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + + private String phone; + + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-api/ruoyi-api-payment/pom.xml b/ruoyi-api/ruoyi-api-payment/pom.xml new file mode 100644 index 0000000..6cbe939 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-payment + + + ruoyi-api-payment系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java new file mode 100644 index 0000000..f71cfb5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java @@ -0,0 +1,312 @@ +package org.dromara.payment.api.bill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单明细视图对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerBillDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java new file mode 100644 index 0000000..5b2ae4c --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java @@ -0,0 +1,277 @@ +package org.dromara.payment.api.bill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单视图对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + private Long serviceChargeType; + + /** + * 服务费比例 + */ + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + private Date payTime; + + /** + * 发放时间 + */ + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + private String passage; + + /** + * 批次下账单明细数量 + */ + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java new file mode 100644 index 0000000..6035830 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户同步记录视图对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java new file mode 100644 index 0000000..2484178 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户视图对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 总收益(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + private Integer isDefault; + + /** + * 昨日收益(分) + */ + private Long yesterday; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java new file mode 100644 index 0000000..4888ab2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java @@ -0,0 +1,146 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商提现记录视图对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java new file mode 100644 index 0000000..604ae50 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java @@ -0,0 +1,146 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商流水视图对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java new file mode 100644 index 0000000..2201af2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java @@ -0,0 +1,115 @@ +package org.dromara.payment.channel.api.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商产品视图对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java new file mode 100644 index 0000000..7daae45 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java @@ -0,0 +1,61 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商业务员视图对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelSalesmanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 业务员名称 + */ + private String name; + + /** + * 业务员编号 + */ + private String no; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java new file mode 100644 index 0000000..0695320 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java @@ -0,0 +1,181 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商视图对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 代理商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java new file mode 100644 index 0000000..b4af68a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.api.common.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 资金账户汇总视图对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 企业id + */ + private Long unitId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + private Integer addYpe; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java new file mode 100644 index 0000000..2472f78 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.common.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 业务操作日志视图对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 日志描述 + */ + private String logDesc; + + /** + * 角色id + */ + private Long createRoleId; + + /** + * 角色名称 + */ + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java new file mode 100644 index 0000000..eef62fd --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.common.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 交易记录视图对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +public class RemoteTranLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易记录id + */ + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + private Long buisId; + + /** + * 交易批次 + */ + private String busBatch; + + /** + * 交易id + */ + private Long tranId; + + /** + * 申请交易时间 + */ + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + private Integer tranResult; + + /** + * 待处理批次 + */ + private String tranBatch; + + /** + * 交易完成时间 + */ + private Date tranTime; + + /** + * 付款账户id + */ + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer sourceAccType; + + /** + * 收款账户id + */ + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + private Integer isCallback; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java new file mode 100644 index 0000000..468a5d4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票地址视图对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceAddressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + private String name; + + /** + * 收件人手机号 + */ + private String phone; + + /** + * 收件地址 + */ + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + private String header; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 单位注册地址 + */ + private String unitAddress; + + /** + * 单位电话 + */ + private String unitPhone; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开户行地址 + */ + private String bankAddress; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java new file mode 100644 index 0000000..592f39a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java @@ -0,0 +1,119 @@ +package org.dromara.payment.invoice.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票明细视图对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 票据id + */ + private Long invId; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单批次号 + */ + private String billNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java new file mode 100644 index 0000000..5faa513 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java @@ -0,0 +1,71 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 开票明细视图对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + private String invNo; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 发票编号 + */ + private String detailNo; + + /** + * 发票样张地址 + */ + private String invPic; + + /** + * 开票类目 + */ + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java new file mode 100644 index 0000000..9737ae9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java @@ -0,0 +1,44 @@ +package org.dromara.payment.invoice.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票类目视图对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 任务类型 + */ + private String parentType; + + /** + * 开票类目 + */ + private String type; + + /** + * 排序 + */ + private Long sort; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java new file mode 100644 index 0000000..5c8b55f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java @@ -0,0 +1,236 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户发票记录视图对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Long type; + + /** + * 纳税人识别号 + */ + private String creditCode; + + /** + * 开户银行地址 + */ + private String bankAddress; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开票类目 + */ + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + private Long addId; + + /** + * 收件人姓名 + */ + private String addName; + + /** + * 收件人手机号 + */ + private String addPhone; + + /** + * 收件地址 + */ + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + private String dwzcdz; + + /** + * 单位电话 + */ + private String dwdh; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java new file mode 100644 index 0000000..d306778 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java @@ -0,0 +1,18 @@ +package org.dromara.payment.api.merchant; + +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; + +import java.util.List; + +/** + * 商户业务 + */ +public interface RemoteMerchantService { + /** + * 获取商户默认的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + RemoteBusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId,Long sydId); +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java new file mode 100644 index 0000000..748ac68 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java @@ -0,0 +1,49 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账户同步视图对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java new file mode 100644 index 0000000..262d738 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java @@ -0,0 +1,105 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户资金账户视图对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + private String merName; + + /** + * 结算中心id + */ + private Long sydId; + + private String sydName; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 可开票已结算金额 + */ + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java new file mode 100644 index 0000000..78c62d4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java @@ -0,0 +1,94 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户协议视图对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java new file mode 100644 index 0000000..a6de751 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java @@ -0,0 +1,121 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户提现记录视图对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java new file mode 100644 index 0000000..89867b1 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java @@ -0,0 +1,44 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户配置视图对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + private Integer valiWorker; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java new file mode 100644 index 0000000..0410b89 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java @@ -0,0 +1,186 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户流水视图对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + /** + * 说明 + */ + private String illustrate; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java new file mode 100644 index 0000000..e7ac5dc --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java @@ -0,0 +1,130 @@ +package org.dromara.payment.api.merchant.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户产品表视图对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java new file mode 100644 index 0000000..940af82 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java @@ -0,0 +1,356 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户视图对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + private String jbrSfzfm; + + /** + * 门头全景照 + */ + private String mtqjzPic; + + /** + * 办公照片1 + */ + private String bgzp1Pic; + + /** + * 办公照片2 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 企业规模 + */ + private String scale; + + /** + * 企业logo地址 + */ + private String logo; + + /** + * 企业介绍 + */ + private String introduce; + + /** + * 业务员id + */ + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + private Integer isValiAcc; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java new file mode 100644 index 0000000..d9ca6c5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java @@ -0,0 +1,336 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户申请表视图对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemotePubMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人证件类型 + */ + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人证件号码 + */ + private String frSfz; + + /** + * 法人证件类型 + */ + private String frZjlx; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人证件有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人证件正面 + */ + private String frSfzzm; + + /** + * 法人证件反面 + */ + private String frSfzfm; + + /** + * 经办人证件正面 + */ + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + private String jbrSfzfm; + + /** + * 门牌照片 + */ + private String mtqjzPic; + + /** + * 前台照片 + */ + private String bgzp1Pic; + + /** + * 办公照片 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 流程确认函 + */ + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 主营业务 + */ + private String zyyw; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java new file mode 100644 index 0000000..7ffb775 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java @@ -0,0 +1,86 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户日账单汇总表视图对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteVMerchantBillDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 统计日期 + */ + private Date vDate; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java new file mode 100644 index 0000000..fa7caa2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java @@ -0,0 +1,99 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账单汇总表视图对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteVMerchantBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + private Long yearTranMoney; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java new file mode 100644 index 0000000..ae1793f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java @@ -0,0 +1,8 @@ +package org.dromara.payment.api.operator; + +/** + * 运营商业务 + */ +public interface RemoteOperatorService { + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java new file mode 100644 index 0000000..42075a5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商资金账户视图对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 提现中金额(分) + */ + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java new file mode 100644 index 0000000..7535a02 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java @@ -0,0 +1,74 @@ +package org.dromara.payment.api.operator.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商协议视图对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java new file mode 100644 index 0000000..6105290 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java @@ -0,0 +1,156 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商提现记录视图对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 发票图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java new file mode 100644 index 0000000..0e730ce --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java @@ -0,0 +1,176 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商流水视图对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java new file mode 100644 index 0000000..8ab175a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java @@ -0,0 +1,112 @@ +package org.dromara.payment.api.operator.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商产品视图对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 服务商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + private BigDecimal setingServiceCharge; + + + private Long createBy; + + private Date createTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java new file mode 100644 index 0000000..285f38d --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java @@ -0,0 +1,196 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商视图对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 运营商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java new file mode 100644 index 0000000..bbb8b44 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java @@ -0,0 +1,59 @@ +package org.dromara.payment.api.operator.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 产品开票类目视图对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteReProductInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java new file mode 100644 index 0000000..9101734 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java @@ -0,0 +1,8 @@ +package org.dromara.payment.api.syd; + +/** + * 服务商业务 + */ +public interface RemoteSydService { + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java new file mode 100644 index 0000000..13c7e3f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java @@ -0,0 +1,47 @@ +package org.dromara.payment.api.syd.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 单位基础信息视图对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +public class RemoteSysUnitVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 企业名称 + */ + private String name; + + /** + * 企业编号 + */ + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Integer unitType; + + /** + * 平台客户号 + */ + private String custNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java new file mode 100644 index 0000000..2783c85 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.api.syd.domain.syd; + +import java.util.Date; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 线下银行账户视图对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +public class RemoteAccAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户名称 + */ + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer useObj; + + /** + * 使用对象id + */ + private Long useObjId; + + /** + * 使用对象名称 + */ + private String useObjName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java new file mode 100644 index 0000000..9d9c18b --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java @@ -0,0 +1,93 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商账户视图对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 税源地id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + private Long accType; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java new file mode 100644 index 0000000..88f1ab4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java @@ -0,0 +1,113 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商提现记录视图对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java new file mode 100644 index 0000000..cd08fb8 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java @@ -0,0 +1,58 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 服务商配置视图对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + private Integer end; + + /** + * 税率(%) + */ + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + private Long calStyle; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java new file mode 100644 index 0000000..0f277fc --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java @@ -0,0 +1,173 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商流水视图对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java new file mode 100644 index 0000000..2414b63 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java @@ -0,0 +1,76 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 服务商产品视图对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String no; + + /** + * 配置服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java new file mode 100644 index 0000000..a58a89a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java @@ -0,0 +1,43 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商协议内容视图对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydSignContentVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + private Long id; + + /** + * 协议内容 + */ + private String content; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java new file mode 100644 index 0000000..f665512 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java @@ -0,0 +1,194 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 服务商视图对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 开户行行号 + */ + private String khhNo; + + /** + * 银行类型(字典) + */ + private Long bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java new file mode 100644 index 0000000..5896279 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java @@ -0,0 +1,106 @@ +package org.dromara.payment.api.task.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java new file mode 100644 index 0000000..78f2890 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java @@ -0,0 +1,241 @@ +package org.dromara.payment.api.task.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务视图对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + /** + * 所属行业 + */ + private String industry; + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + private Date beginDate; + + /** + * 任务结束日期 + */ + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java new file mode 100644 index 0000000..8570429 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java @@ -0,0 +1,62 @@ +package org.dromara.payment.api.worker; + +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWokerService + * @description + * @create 2024-05-06 18:13 + */ +public interface RemoteUserWokerService { + + + /*** + * 下载单个用户的身份证信息 + * @param vo + * @return + * @throws Exception + */ + byte[] downLoadSigleSfzZip(RemoteUserWorkerZipVo vo) throws Exception; + + + /**** + * 打包下载发票信息 + * @param list + * @return + * @throws Exception + */ + byte[] downLoadInvZip(List list) throws Exception; + + + /*** + * 下载身份证信息,批量 + * @param list + * @return + */ + RemoteResultZip createWorkerSfzZip(List list)throws Exception; + + + + /*** + * 下载合同信息 + * @param list + * @return + */ + + RemoteResultZip createWorkerHtZip(List list)throws Exception; + + + + /*** + * 下载支付凭证 + * @param list + * @return + */ + + RemoteResultZip createWorkerPayCerZip(List list)throws Exception; +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java new file mode 100644 index 0000000..bb04ff0 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java @@ -0,0 +1,22 @@ +package org.dromara.payment.api.worker.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteResultZip + * @description + * @create 2024-06-21 14:33 + */ +@Data +public class RemoteResultZip implements Serializable { + + + private Long ossId; + + private String url; + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java new file mode 100644 index 0000000..9605fbf --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.api.worker.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerVo + * @description + * @create 2024-05-06 17:58 + */ +@Data +public class RemoteUserWorkerZipVo implements Serializable { + + private static final long serialVersionUID = 1L; + + //用工ID + private Long workId; + + //姓名 + private String workName; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //合同 + private String htUrl; + + + //业务类型 + private Integer busType; + + //业务流水号 + private String busNo; + + //B2C支付回执 + private String payReceipt; + + //发票编号 + private String invNo; + + //发票样张 + private String invPic; + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java new file mode 100644 index 0000000..f9b127b --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java @@ -0,0 +1,26 @@ +package org.dromara.payment.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 日志业务类型 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum BusLogType { + /** + * 账单 + */ + BILL(2, "账单"), + /** + * 项目 + */ + TASK(1, "项目"); + + private final int id; + private final String name; + +} diff --git a/ruoyi-api/ruoyi-api-resource/pom.xml b/ruoyi-api/ruoyi-api-resource/pom.xml new file mode 100644 index 0000000..619a481 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-resource + + + ruoyi-api-resource 资源服务接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + com.alibaba + fastjson + ${fastjson.version} + + + + diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java new file mode 100644 index 0000000..c1a9d6a --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java @@ -0,0 +1,23 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.domain.RemoteDhq; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhqService + * @description + * @create 2024-05-20 9:54 + */ +public interface RemoteDhqService { + + /***** + * 大鸿签发起签约 + * @param sign + * @return + * @throws Exception + */ + public String becomeSign(RemoteDhq sign, String domain, SignType signType) throws Exception; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java new file mode 100644 index 0000000..6ab788e --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java @@ -0,0 +1,29 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteFile; + +/** + * 文件服务 + * + * @author Lion Li + */ +public interface RemoteFileService { + + /** + * 上传文件 + * + * @param file 文件信息 + * @return 结果 + */ + RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException; + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + String selectUrlByIds(String ossIds); + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java new file mode 100644 index 0000000..c689f2d --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java @@ -0,0 +1,37 @@ +package org.dromara.resource.api; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.domain.RemoteFile; + +/** + * 文件服务(降级处理) + * + * @author Lion Li + */ +@Slf4j +public class RemoteFileServiceMock implements RemoteFileService { + + /** + * 上传文件 + * + * @param file 文件信息 + * @return 结果 + */ + public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) { + log.warn("服务调用异常 -> 降级处理"); + return null; + } + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + public String selectUrlByIds(String ossIds) { + log.warn("服务调用异常 -> 降级处理"); + return StringUtils.EMPTY; + } + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java new file mode 100644 index 0000000..d540bfc --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java @@ -0,0 +1,43 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.domain.RemoteJzq; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteJzqService + * @description + * @create 2024-05-20 9:54 + */ +public interface RemoteJzqService { + + /***** + * 君子签发起签约 + * @param sign + * @return + * @throws Exception + */ + public String becomeSign(RemoteJzq sign, String domain, SignType signType); + + public String link(String applyNo,String fullName,String identityCard,int identityType); + + public String bankThreeVerify(String name ,String identityCard,String cardNo); + + public String userValid(String name ,String identityCard); + + public String ocrIdentity(String file, Integer front); + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone); + + public String ocrBank(File file); + + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom); + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile); + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java new file mode 100644 index 0000000..b63e541 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java @@ -0,0 +1,21 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.exception.ServiceException; + +/** + * 邮件服务 + * + * @author Lion Li + */ +public interface RemoteMailService { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + void send(String to, String subject, String text) throws ServiceException; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java new file mode 100644 index 0000000..6b2ecb5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java @@ -0,0 +1,19 @@ +package org.dromara.resource.api; + +/** + * 消息服务 + * + * @author Lion Li + */ +public interface RemoteMessageService { + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + void sendMessage(Long sessionKey, String message); + + void publishAll(String message); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java new file mode 100644 index 0000000..813fba6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java @@ -0,0 +1,38 @@ +package org.dromara.resource.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 消息服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +public class RemoteMessageServiceStub implements RemoteMessageService { + + private final RemoteMessageService remoteMessageService; + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + public void sendMessage(Long sessionKey, String message) { + try { + remoteMessageService.sendMessage(sessionKey, message); + } catch (Exception e) { + log.warn("websocket 功能未开启或服务未找到"); + } + } + + public void publishAll(String message) { + try { + remoteMessageService.publishAll(message); + } catch (Exception e) { + log.warn("websocket 功能未开启或服务未找到"); + } + } +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java new file mode 100644 index 0000000..39b489d --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java @@ -0,0 +1,41 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteSms; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 短信服务 + * + * @author Lion Li + */ +public interface RemoteSmsService { + + /** + * 发送短信 + * + * @param phones 电话号(多个逗号分割) + * @param templateId 模板id + * @param param 模板对应参数 + */ + RemoteSms send(String phones, String templateId, LinkedHashMap param) throws ServiceException; + + + + + Boolean sendSmsCode(SmsType smsType, String phonenumber, LinkedHashMap param, Map configMap); + + /** + * 发送短信 + * + * @param domain 站点名称 + * @param phone 手机号 + * @param smsType 短信类型 + * @param param 模板对应参数 + */ + RemoteSms send(String domain, String phone, SmsType smsType, LinkedHashMap param) throws ServiceException; + + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java new file mode 100644 index 0000000..9a2d546 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java @@ -0,0 +1,31 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteSms; + +import java.util.LinkedHashMap; + +/** + * 微信服务 + * + * @author Lion Li + */ +public interface RemoteWeiXinService { + + /** + * 生成公众号授权二维码 + * @param redirectUri 授权回调url + * @return + * @throws ServiceException + */ + String genPubAuthQrcode(String domain,String redirectUri) throws ServiceException; + + /** + * 获取授权用户的微信openid + * @param domain + * @param code + * @return + */ + String getOpenId(String domain,String code); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java new file mode 100644 index 0000000..19e92db --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java @@ -0,0 +1,56 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhq + * @description + * @create 2024-05-20 9:53 + */ + +@Data +public class RemoteDhq implements Serializable { + //应用ID + private String applicationId; + + //合作账户 ID + private String businessId; + + private String launchName; + + //发起类型 0-个人 1-企业 + private String launchType; + + //发起用户手机号 + private String launchSubject; + + //发起企业名称(launchType 为 1 企业发 + //起合同时必传) + private String launchEnterpriseName; + + //客户发起时定义的编号 + private String customerOriginationNumber; + + //模板编号 + private String contractModelNum; + + //静默签署企业名 +// private String signEnterpriseName; + + //合同名称 + private String contractName; + + //签署人信息 (json 格式字符串) + private String signatoryInfos; + + private List inputValues; + + private Integer signatureType = 0; + + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java new file mode 100644 index 0000000..ecc4b16 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java @@ -0,0 +1,34 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 文件信息 + * + * @author ruoyi + */ +@Data +public class RemoteFile implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * oss主键 + */ + private Long ossId; + + /** + * 文件名称 + */ + private String name; + + /** + * 文件地址 + */ + private String url; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java new file mode 100644 index 0000000..3949a83 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java @@ -0,0 +1,96 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +public class RemoteJzq implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 合同名称,非空,最长100个字符 + */ + private String contractName; + + /** + * 签约方,参考后面签约方说明 + */ + private List signatories; + + /** + * 是否需要服务端云证书:非1不需要(默认);1需要;建议需要,否则影响后续司法服务 + */ + private Integer serverCa; + + /** + * 处理方式:为空或0时默认为手签合同(用户有感知);2只保全;5部份自动签;6HASH只保全;17收集信息批量签 + */ + private Integer dealType; + + /** + * 合同模版编号, fileType=2或4, 时必须传入 + */ + private String templateNo; + + /** + * 合同模版参数JSON字符串, fileType=2或4, 时必须传入 + */ + private String templateParams; + + /** + * 2 API模版(HTML源码); 4 API模板(PDF文件/word文件) + */ + private Integer fileType; + + /** + * ofd文件追加内容(0不能追加内容,1允许追加内容),允许追加内容时noEbqSign需要设置为2 + */ + private Integer addPage; + + /** + * 指定公章位置类型: 0或null使用签字座标位置或不指定签字位置; 1表单域定位(表单域如果上传为pdf时,需pdf自行定义好表单域); 2关键字定义 + */ + private Integer positionType; + + /** + * 验证方式为人脸时必传, 人脸识别阀值: 默认等级(1-100之间整数),建议大于72, 验证方式在签约方中(signatories)设置 + */ + private Integer faceThreshold; + +// /** +// * 是否按顺序签字,非1为不按,1为按 +// */ +// private Integer orderFlag; +// +// /** +// * 多合同顺序签约或批量签合同关联信息,参考后面表格说明 +// */ +// private Map sequenceInfo; +// + /** + * 合同签署完成后异步通知地址 + */ + private String notifyUrl; +// +// /** +// * 不显示ebq的保全章: 1不显示但会签名, 2不显示也不签名; 0或其它-显示 +// */ +// private Integer noEbqSign; +// +// /** +// * 合同附件, 虽不限个数, 但包括合同原文件, 不能超过30MB, *SDK引用中的多文件同名情况的上传说明 +// */ +// private String[] attachFiles; +// +// /** +// * 是否使用骑缝章: 1使用; 2个人不要企业要,3个人要企业不要 +// */ +// private Integer needQifengSign; +// +// /** +// * 是否不显示个人标准章边框: 1不显示;0显示边框(默认);2不显示边框标准章字体为黑 +// */ +// private Integer noBorderSign; +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java new file mode 100644 index 0000000..430eb5b --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java @@ -0,0 +1,36 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 文件信息 + * + * @author ruoyi + */ +@Data +public class RemoteSms implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 是否成功 + */ + private Boolean isSuccess; + + /** + * 响应消息 + */ + private String message; + + /** + * 实际响应体 + *

+ * 可自行转换为 SDK 对应的 SendSmsResponse + */ + private String response; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java new file mode 100644 index 0000000..5f66500 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java @@ -0,0 +1,10 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +@Data +public class SequenceInfo { + private String businessNo; + private Integer sequenceOrder; + private Integer totalNum; +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java new file mode 100644 index 0000000..2a1d11e --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java @@ -0,0 +1,99 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

    + *
  • 项目名称 : 后台服务
  • + *
  • 文件名称 : SignatoryReq
  • + *
  • 创建时间 : 2019/8/9 9:58
  • + *
  • 描 述 : 签约方请求 + *
+ * + * @author yfx + * @title 签约方请求 + */ +@Data +public class SignatoryReq implements Serializable { + + // 签约方名称,不超过50个字符, 必填 + private String fullName; + + // 身份类型:1身份证,2护照,3台胞证,4港澳居民来往内地通行证,11营业执照,12统一社会信用代码, 必填 + private Integer identityType; + + // 证件号,不超过50个字符, 必填 + private String identityCard; + + // 手机号码(个人必传),11个字符 + private String mobile; + + // 邮箱,企业必传 + private String email; + + // 签字顺序:连续签(orderNum只是针对于当前合同),顺序签时需指定 + private Integer orderNum; + + // 签字位置座标信息:positionType=0时可以传入chapteJson + private String chapteJson; + + // 签字位置-表单域名ID:positionType=1时必须传入 + private String chapteName; + + // 签字位置-按关键字签署,positionType=2时必须传入,关键字支持多个;以英文;分隔 + private String searchKey; + + // 签字位置-按关键字查询-扩展,positionType=2时可以传入,支持指定查询页数/关键字颜色/透明度.可参考相关说明 + private String searchExtend; + + // 签字位置-按关键字查询-结果转换的配置,positionType=2时可以传入,可配置查询结果的位置偏移.可参考后面说明 + private String searchConvertExtend; + + // 签约方需要手签时是否不先行验证手机或邮箱:1不验证,其它验证(默认) + private Integer noNeedVerify; + + // 是否使用自动签,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效);有些场景必须serverCaAuto=1 + private Integer serverCaAuto; + + // 验证等级(传数组字符串):[2,3];2银行卡认证,10三要素认证,11人脸识别,12验证码验证 + private String authLevel; + + // 最小验证种类:默认为authLevel数组长度;必须小于authLevel长度且大于0(等于0时按authLevel数组长度计录);如authLevel=[2,3,10],authLevelRange=2表过只需要验证其中的两项即可 + private Integer authLevelRange; + + // 签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写 + private Integer signLevel; + + // 强制添加现场:0或null:不强制添加现场,1:强制添加现场 + private Integer forceEvidence; + + // 买保险年数:1-3购买年限,基它不买;注需要有相应的套餐 + private Integer insureYear; + + // 强制阅读多少秒,单位1-300秒 + private Integer readTime; + + // 企业用户指定签章ID:此值需为商户上传的自定义公章ID,或商户创建的企业的自定义公章ID。自定义公章可通过sass或api上传 + private String signId; + + // 标准章时是否对个人或企业章图片打码:0不打,1打码 + private Integer nameHideStatus; + + // h5人脸订单号,如使用过君子签提供的人脸认证服务可以上传其订单号 + private String h5FaceOrderNo; + + // 现场存证只能上传视频:1是,其它不是(默认) + private Integer onlyVideoEvidence; + + // 现场存证自定义标题 + private String evidenceTitle; + + // 是否使用电子保管函:1使用0或其它不使用;使用时需有相应套餐 + private Integer safeKeepLetterFlag; + + // api发起显示确认签字 + private Integer apiAffirm; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java new file mode 100644 index 0000000..82cdfb9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java @@ -0,0 +1,48 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode +@Data +public class SmsConfig { + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java new file mode 100644 index 0000000..9470070 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java @@ -0,0 +1,30 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title TencentSmsConfig + * @description + * @create 2024-04-07 16:55 + */ + + +@Data +public class TencentSmsConfig implements Serializable { + private String accessKeyId; + private String accessKeySecret; + private String signature; + private String templateId; + private String sdkAppId; + private String territory; + private Integer connTimeout; + private String requestUrl; + private String action; + private String version; + private String service; + +} diff --git a/ruoyi-api/ruoyi-api-settlement/pom.xml b/ruoyi-api/ruoyi-api-settlement/pom.xml new file mode 100644 index 0000000..1ee91d9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-settlement + + + ruoyi-api-settlement系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java new file mode 100644 index 0000000..9d2281d --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java @@ -0,0 +1,150 @@ +package org.dromara.settlement.api; + +import org.dromara.settlement.api.domain.*; + +import java.util.List; + + + +public interface RemoteAccountService +{ + /** + * 创建虚拟银行账号 + * @author 张涛 + * @date 2021年8月18日 + * @param unitId 税源地id + * @param userType 用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台) + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @return + */ + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType,Long code); + + /** + * 创建虚拟银行账号 + * + * @param unitId 税源地id + * @param userType 用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台) + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @param bindAcctNo 绑卡账户号码(真实公户) + * @param bindAcctName 绑卡账户名称(真实公户) + * @return + * @author 张涛 + * @date 2021年8月18日 + */ + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType, String bindAcctNo, String bindAcctName,Long code); + + /** + * 获取虚拟银行账号收款账户名 + * + * @param unitId 税源地id + * @param bankType 银行名称 + * @param bankCard 银行卡号 + * @return + * @author 张涛 + * @date 2021年8月26日 + */ + public Result getAccountName(long unitId, String bankType, String bankCard); + + /** + * 获取虚拟银行账号收款账户 + * + * @param unitId 税源地id + * @param bankType 银行名称 + * @return + * @author 张涛 + * @date 2021年8月26日 + */ + public Result getMainAccount(long unitId, String bankType); + + /** + * 创建指定银行账号 + * + * @param account + * @return + * @author 张涛 + * @date 2021年8月20日 + */ + public Result addAccount(Account account); + + /** + * 同步银行账户 + * @author 张涛 + * @date 2021年9月6日 + * @param id 银行账户id + * @param trxdir 流水方向(1:收入 2:支出) + * @param synPosition 已同步位置id + * @param exclude 排除的交易摘要 + * @return + */ + public Result synAccount(int id, Short trxdir, long synPosition, List exclude); + + /** + * 申请银行账户转账 + * @author 张涛 + * @date 2021年9月7日 + * @param sourceAccId 付款账户id + * @param targetAccId 收款账户id + * @param amount 转账金额(分) + * @param order 流水号(系统内部编号) + * @param remark 转账摘要 + * @return + */ + public Result applyTransfer(int sourceAccId, int targetAccId, Long amount, String order, String remark); + + /** + * 银行账户转账 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result transfer(long tranId); + + /** + * 同步银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result synTransfer(long tranId); + + /** + * 查询交易记录 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result getTransfer(long tranId); + + /** + * 获取交易流水号 + * @author 张涛 + * @date 2021年9月22日 + * @param tranId 交易id + * @return + */ + public Result getTransferBankNo(long tranId); + + /** + * 获取交易回置单 + * @author 张涛 + * @date 2021年9月16日 + * @param tranId 交易id + * @return + */ + public Result getTransferCallBack(long tranId); + + /** + * 获取签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param unitId 单位id + * @param unitName 单位名称 + * @return + */ + public Result getSignInfo(long unitId, String unitName, String bankType); +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java new file mode 100644 index 0000000..c665f8e --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java @@ -0,0 +1,63 @@ +package org.dromara.settlement.api; + + +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.auth.BankCardInfo; +import org.dromara.settlement.api.domain.auth.BankInfo; +import org.dromara.settlement.api.domain.auth.CardIdBack; +import org.dromara.settlement.api.domain.auth.CardIdPositive; + +public interface RemoteAuthService +{ + /** + * 认证身份证正面 + * @author 张涛 + * @date 2021年8月17日 + * @param positive 正面图片地址 + * @return + */ + public Result authCardIdPositive(String positive); + + /** + * 认证身份证反面 + * @author 张涛 + * @date 2021年8月17日 + * @param positive 正面图片地址 + * @return + */ + public Result authCardIdBack(String back); + + /** + * 认证银行卡信息 + * @author 张涛 + * @date 2021年8月17日 + * @param bankcardUrl 银行卡地址 + * @return + */ + public Result authBankInfo(String bankcardUrl); + + /** + * 认证银行卡是否一致 + * @author 张涛 + * @date 2021年8月17日 + * @param bankcard 银行卡号 + * @param name 银行卡账户名 + * @param idcard 身份证号 + * @return + */ + public Result authBankMatch(String bankcard, String name, String idcard); + + /** + * 验证银行账号是否有效 + * @author 张涛 + * @date 2022年12月8日 + * @param unitId 税源地id + * @param bankType 银行名称 + * @param bankCard 银行卡号 + * @param mobile 手机号 + * @param name 姓名 + * @param cardId 身份证号 + * @return + */ + public Result valiAccount(long unitId,String bankType, String bankCard,String mobile,String name,String cardId); +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java new file mode 100644 index 0000000..668d2f5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java @@ -0,0 +1,158 @@ +package org.dromara.settlement.api; + + +import org.dromara.settlement.api.constant.SystemConfig; +import org.dromara.settlement.api.domain.*; + +import java.util.List; +import java.util.Map; + + +/** + * 配置业务 + * @author 张涛 + * @date 2019年4月29日 + */ +public interface RemoteConfigService { + /** + * 验证服务是否能访问 + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param key 访问权限唯一标识 + * @return + */ + public Boolean valiServiceAccess(long unitId,String key); + + /** + * 获取配置项(单个) + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param key 配置项key + * @return + */ + public String getItem(long unitId,String key); + + /** + * 获取配置项(多个) + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param keys 配置项key + * @return + */ + public Map getItems(long unitId,String... keys); + + /** + * 获取存储类型 + * @author 张涛 + * @date 2021年1月20日 + * @param unitId 单位id + * @return + */ + public SystemConfig.StoreType getStoreType(long unitId); + + /** + * 获取上传图片的网络路径 + * + * @return + */ + public String getUploadNetPath(long unitId); + + /** + * 获取上传图片的物理路径 + * + * @return + */ + public String getUploadPhyPath(long unitId); + + + /** + * 获取七牛上传凭证 + * + * @return + */ + public String getQiNiuUptoken(long unitId); + + /** + * 获取七牛访问域名 + * + * @return + */ + public String getQiNiuDomain(long unitId); + + /** + * Description: {获取企业大类信息} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfClass(Long unit_id, String unitType); + + /** + * Description: {获取大类下的组信息} + * @param :unit_id:企业id,class_alias:大类名称 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfGroupByUnit(Long unit_id, String class_alias); + + /** + * Description: {获取组下的表单配置项} + * @param :unit_id:企业id,conf_group:组名称 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfDetailByUnit(Long unit_id, String conf_group); + + /** + * Description: {编辑配置项} + * @param :配置项明细 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result editConfDetail(List lendReco); + + /** + * + * Description: {获取七牛上传所需配置} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.config + * @author: dinghongbo + * @date :2021年2月2日 + * Note: Nothing much. + */ + public Result getQiniuConfg(Long unit_id); + + /** + * Description: {修改配置项目} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.config + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public Result saveConfigById(Long unitId, String key,String value); + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java new file mode 100644 index 0000000..2854510 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java @@ -0,0 +1,87 @@ +package org.dromara.settlement.api.constant; + +/** + * 系统配置项 + * @author 张涛 + * @date 2021年1月20日 + */ +public enum SystemConfig { + /** + * 默认密码 + */ + Default_Password("user.default.password"), + /** + * 默认昵称 + */ + Default_Nickname("user.default.nickname"), + /** + * 默认头像 + */ + Default_Avatar("user.default.avatar"), + /** + * 客服电话 + */ + Default_CustomerPhone("system.app.customerphone"), + /** + * 教育备案 + */ + Default_EducationRecord("system.app.educationrecord"), + /** + * 安全等保 + */ + Default_SafetyGuarantee("system.app.safetyguarantee"); + + // 定义私有变量 + private String key; + + // 构造函数,枚举类型只能为私有 + private SystemConfig(String key) { + this.key = key; + } + + @Override + public String toString() { + return this.key; + } + + public String getValue() { + return this.key; + } + + public enum StoreType { + /** + * 七牛云存储 + */ + Store_Qiniu("store.qiniu"), + /** + * 本地存储 + */ + Store_Local("store.local"); + + // 定义私有变量 + private String key; + + // 构造函数,枚举类型只能为私有 + private StoreType(String key) { + this.key = key; + } + + @Override + public String toString() { + return this.key; + } + + public String getValue() { + return this.key; + } + + public static StoreType valueOfs(String storeType){ + if (storeType.equals(Store_Qiniu.key)) { + return Store_Qiniu; + }else if (storeType.equals(Store_Local.key)) { + return Store_Local; + } + return null; + } + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java new file mode 100644 index 0000000..95c12b2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java @@ -0,0 +1,193 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Account implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 5391155157254537039L; + + private Long mer_id; + + private Integer id; + + private Long unitId; + + private String bankType; + + private String bankTypeName; + + private String bankCard; + + private Long balance; + + private Long frozen; + + private Short status; + + private Short type; + + private Date addTime; + + private Date editTime; + + private String name; + + private String bankAddress; + + private Long sydId; + + private String bankArgNo; + + private String bankNo; + + private String bankName; + + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankNo() { + return bankNo; + } + + public void setBankNo(String bankNo) { + this.bankNo = bankNo; + } + + public Long getSydId() { + return sydId; + } + + public void setSydId(Long sydId) { + this.sydId = sydId; + } + + public Long getFrozen() { + return frozen; + } + + public void setFrozen(Long frozen) { + this.frozen = frozen; + } + + public Long getMer_id() { + return mer_id; + } + + public void setMer_id(Long mer_id) { + this.mer_id = mer_id; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Short getStatus() { + return status; + } + + public void setStatus(Short status) { + this.status = status; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getEditTime() { + return editTime; + } + + public void setEditTime(Date editTime) { + this.editTime = editTime; + } + + public String getBankTypeName() { + return bankTypeName; + } + + public void setBankTypeName(String bankTypeName) { + this.bankTypeName = bankTypeName; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Short getType() { + return type; + } + + public void setType(Short type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBankAddress() { + return bankAddress; + } + + public void setBankAddress(String bankAddress) { + this.bankAddress = bankAddress; + } + + public String getBankArgNo() { + return bankArgNo; + } + + public void setBankArgNo(String bankArgNo) { + this.bankArgNo = bankArgNo; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java new file mode 100644 index 0000000..b4da6d2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java @@ -0,0 +1,211 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class AccountLog implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -2239121995008551353L; + + private Long id; + + private Long unitId; + + private Integer accId; + + private String bankType; + + private String bankCard; + + private Short trxdir; + + private Long trxamt; + + private Long balance; + + private Date addTime; + + private String addBy; + + private String narinn; + + private String refundTrxnbr; + + private String refundDate; + + private String trxnbr; + + private String ccynbr; + + private Date tranTime; + + private String rpyacc; + + private String rpynam; + + private String trxtxt; + + private String mthflg; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Integer getAccId() { + return accId; + } + + public void setAccId(Integer accId) { + this.accId = accId; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + public Short getTrxdir() { + return trxdir; + } + + public void setTrxdir(Short trxdir) { + this.trxdir = trxdir; + } + + public Long getTrxamt() { + return trxamt; + } + + public void setTrxamt(Long trxamt) { + this.trxamt = trxamt; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public String getAddBy() { + return addBy; + } + + public void setAddBy(String addBy) { + this.addBy = addBy; + } + + public String getNarinn() { + return narinn; + } + + public void setNarinn(String narinn) { + this.narinn = narinn; + } + + public String getTrxnbr() { + return trxnbr; + } + + public void setTrxnbr(String trxnbr) { + this.trxnbr = trxnbr; + } + + public String getCcynbr() { + return ccynbr; + } + + public void setCcynbr(String ccynbr) { + this.ccynbr = ccynbr; + } + + public Date getTranTime() { + return tranTime; + } + + public void setTranTime(Date tranTime) { + this.tranTime = tranTime; + } + + public String getRpyacc() { + return rpyacc; + } + + public void setRpyacc(String rpyacc) { + this.rpyacc = rpyacc; + } + + public String getRpynam() { + return rpynam; + } + + public void setRpynam(String rpynam) { + this.rpynam = rpynam; + } + + public String getTrxtxt() { + return trxtxt; + } + + public void setTrxtxt(String trxtxt) { + this.trxtxt = trxtxt; + } + + public String getMthflg() { + return mthflg; + } + + public void setMthflg(String mthflg) { + this.mthflg = mthflg; + } + + public String getRefundTrxnbr() { + return refundTrxnbr; + } + + public void setRefundTrxnbr(String refundTrxnbr) { + this.refundTrxnbr = refundTrxnbr; + } + + public String getRefundDate() { + return refundDate; + } + + public void setRefundDate(String refundDate) { + this.refundDate = refundDate; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java new file mode 100644 index 0000000..e1a8af1 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java @@ -0,0 +1,154 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +public class AccountSyn implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -318137089612106814L; + + private Integer id; + + private Byte synLock; + + private Date synTime; + + private String synPosition; + + private Short type; + + private String bankType; + + private String bankCard; + + private Long balance; + + private Long addAmount; + + private Long reductionAmount; + + private List logs; + + private Long unitId; + + private String trxnbrs; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Byte getSynLock() { + return synLock; + } + + public void setSynLock(Byte synLock) { + this.synLock = synLock; + } + + public Date getSynTime() { + return synTime; + } + + public void setSynTime(Date synTime) { + this.synTime = synTime; + } + + public String getSynPosition() { + return synPosition; + } + + public void setSynPosition(String synPosition) { + this.synPosition = synPosition; + } + + public Short getType() { + return type; + } + + public void setType(Short type) { + this.type = type; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + /** + * 新收入金额 + * @author 张涛 + * @date 2021年9月3日 + * @return + */ + public Long getAddAmount() { + return addAmount; + } + + public void setAddAmount(Long addAmount) { + this.addAmount = addAmount; + } + + /** + * 新支出金额 + * @author 张涛 + * @date 2021年9月3日 + * @return + */ + public Long getReductionAmount() { + return reductionAmount; + } + + public void setReductionAmount(Long reductionAmount) { + this.reductionAmount = reductionAmount; + } + + public List getLogs() { + return logs; + } + + public void setLogs(List logs) { + this.logs = logs; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public String getTrxnbrs() { + return trxnbrs; + } + + public void setTrxnbrs(String trxnbrs) { + this.trxnbrs = trxnbrs; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java new file mode 100644 index 0000000..95e2715 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java @@ -0,0 +1,51 @@ +package org.dromara.settlement.api.domain; + +/** + * 阿里云基础信息 + * @author 张涛 + * @date 2017年12月5日 + */ +public class AliyunBaseInfo { + public AliyunBaseInfo(){} + + public AliyunBaseInfo(String accessKey, String secretKey) { + this.accessKey = accessKey; + this.secretKey = secretKey; + } + + private String accessKey; + + private String secretKey; + + /** + * 阿里云AccessKey + * + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + /** + * 阿里云SecretKey + * + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java new file mode 100644 index 0000000..0e9ee94 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java @@ -0,0 +1,74 @@ +package org.dromara.settlement.api.domain; + +/** + * 阿里云上传凭证信息 + * @author 张涛 + * @date 2017年12月5日 + */ +public class AliyunUploadInfo extends AliyunBaseInfo{ + public AliyunUploadInfo(){} + + + + public AliyunUploadInfo(String accessKey, String secretKey, String uploadAddress, + String uploadAuth) { + // TODO 自动生成的构造函数存根 + super(accessKey, secretKey); + this.uploadAddress = uploadAddress; + this.uploadAuth = uploadAuth; + } + + + + public AliyunUploadInfo(String accessKey, String secretKey, String videoId, String uploadAddress, + String uploadAuth) { + super(accessKey, secretKey); + this.videoId = videoId; + this.uploadAddress = uploadAddress; + this.uploadAuth = uploadAuth; + } + private String videoId; + private String uploadAddress; + private String uploadAuth; + + /** + * 视频ID + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getVideoId() { + return videoId; + } + public void setVideoId(String videoId) { + this.videoId = videoId; + } + + /** + * 上传地址 + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getUploadAddress() { + return uploadAddress; + } + public void setUploadAddress(String uploadAddress) { + this.uploadAddress = uploadAddress; + } + + /** + * 上传凭证 + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getUploadAuth() { + return uploadAuth; + } + public void setUploadAuth(String uploadAuth) { + this.uploadAuth = uploadAuth; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java new file mode 100644 index 0000000..897ddf0 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java @@ -0,0 +1,27 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +public class MainAccount implements Serializable { + + private static final long serialVersionUID = -5269873444319953793L; + private String accountName = ""; + + private String khh = ""; + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getKhh() { + return khh; + } + + public void setKhh(String khh) { + this.khh = khh; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java new file mode 100644 index 0000000..730deac --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java @@ -0,0 +1,97 @@ +/** + +*

Title: QiNiuConfig.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年2月2日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 七牛配置信息类 + * @author DHB + * + */ +public class QiNiuConfig implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7326134253544842394L; + + + private String QiNiu_AccessKey; + + private String QiNiu_BUCKET; + + private String QiNiu_DOMAIN; + + private String QiNiu_Region; + + private String QiNiu_SecretKey; + + private String token; + + public String getQiNiu_AccessKey() { + return QiNiu_AccessKey; + } + + public void setQiNiu_AccessKey(String qiNiu_AccessKey) { + QiNiu_AccessKey = qiNiu_AccessKey; + } + + public String getQiNiu_BUCKET() { + return QiNiu_BUCKET; + } + + public void setQiNiu_BUCKET(String qiNiu_BUCKET) { + QiNiu_BUCKET = qiNiu_BUCKET; + } + + public String getQiNiu_DOMAIN() { + return QiNiu_DOMAIN; + } + + public void setQiNiu_DOMAIN(String qiNiu_DOMAIN) { + QiNiu_DOMAIN = qiNiu_DOMAIN; + } + + public String getQiNiu_Region() { + return QiNiu_Region; + } + + public void setQiNiu_Region(String qiNiu_Region) { + QiNiu_Region = qiNiu_Region; + } + + public String getQiNiu_SecretKey() { + return QiNiu_SecretKey; + } + + public void setQiNiu_SecretKey(String qiNiu_SecretKey) { + QiNiu_SecretKey = qiNiu_SecretKey; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java new file mode 100644 index 0000000..7bc4b73 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java @@ -0,0 +1,55 @@ +package org.dromara.settlement.api.domain; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商户充值账户视图对象 + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RechargeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * 充值账户名称 + */ + private String accName; + + /** + * 充值账户开户行 + */ + private String khh; + + /** + * 充值账户开户地 + */ + private String khd; + + /** + * 充值账户所属银行 + */ + private String bankType; + + /** + * 充值账户收款账号 + */ + private String bankCard; + + /** + * 充值账户联行号 + */ + private String khhNo; + + /** + * 充值账户银行转账附言 + */ + private String remark; +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java new file mode 100644 index 0000000..898a1e6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java @@ -0,0 +1,251 @@ +package org.dromara.settlement.api.domain; + + +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; + + +/** + * 业务结果抽象类 + * @author 张涛 + * @date 2019年4月29日 + * @param + */ +public class Result implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 7172632469626661391L; + + public Result(){} + + public Result(T ret){ + setRtnData(ret); + } + + public Result(T ret, boolean errorRetry){ + setRtnData(ret); + setErrorRetry(errorRetry); + } + + public Result(String error){ + setResult(error); + } + + public Result(T ret, String error){ + setRtnData(ret); + setResult(error); + } + + /** + * 错误提醒 + */ + private String result; + + /** + * 返回成功失败代码,两端约定好 默认值为200 + */ + private int rtnCode =ResultCodeEnum.SUCCESS.Code(); + + /** + * 是否启用错误重试 + */ + private boolean errorRetry = false; + + /** + * 分页前数据总条数 + */ + private Long total; + + /** + * 服务端响应返回数据 + */ + private T rtnData; + + /** + * 当前页数 + */ + private Long currentPage; + + public Long getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(Long currentPage) { + this.currentPage = currentPage; + } + + public int getRtnCode() { + return rtnCode; + } + + public void setRtnCode(ResultCodeEnum _enum) { + this.rtnCode = _enum.Code(); + } + + public T getRtnData() { + return rtnData; + } + + public void setRtnData(T rtnData) { + this.rtnData = rtnData; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + /** + * 是否有错误 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasError(){ + return getRtnCode() == ResultCodeEnum.ERROR.Code(); + } + + /** + * 是否有错误 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasError(org.slf4j.Logger log){ + boolean result = hasError(); + if(result) + log.error(getResult()); + return result; + } + + /** + * 清空错误 + * @author 张涛 + * @date 2019年4月29日 + */ + public void clearError(){ + setResult(null); + setRtnCode(ResultCodeEnum.SUCCESS); + } + + /** + * 添加错误 + * @author 张涛 + * @date 2019年4月29日 + * @param error 错误提示 + */ + public void addError(String error){ + setRtnData(null); + setRtnCode(ResultCodeEnum.ERROR); + if (StringUtils.isBlank(getResult())) { + setResult(error); + }else{ + setResult(getResult()+";"+error); + } + } + + /** + * 设置需要确认消息 + * @author 张涛 + * @date 2020年2月11日 + * @param msg 确认提醒内容 + */ + public void confirm(String msg){ + setRtnCode(ResultCodeEnum.CONFIRM); + setResult(msg); + } + + /** + * 设置业务提示 + * @author 张涛 + * @date 2020年2月11日 + * @param msg 业务提示内容 + */ + public void tip(String msg){ + setRtnCode(ResultCodeEnum.TIP); + setResult(msg); + } + + /** + * 是否有业务提示 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasTip(){ + return getRtnCode() == ResultCodeEnum.TIP.Code(); + } + + /** + * 获取错误列表 + * @author 张涛 + * @date 2019年5月5日 + * @return + */ + public String[] getErrors(){ + if (hasError() && StringUtils.isNotBlank(getResult())) { + return getResult().split(";"); + } + return null; + } + + /** + * 验证是否成功 + * @author 张涛 + * @date 2019年5月6日 + * @param other + * @return + */ + public boolean isSuccess(Result other){ + if(other != null){ + if(!other.hasError()){ + return true; + }else{ + addError(other.getResult()); + setRtnData(null); + } + }else{ + setRtnData(null); + } + return false; + } + + /** + * 验证是否需要确认,如果需要确认,前端操作:是,则再次调用返回需要确认的业务 + * @author 张涛 + * @date 2020年2月5日 + * @return 是否需要确认 + */ + public boolean isNeedConfirm(){ + return rtnCode == ResultCodeEnum.CONFIRM.Code(); + } + + /** + * 是否启用错误重试 + * @author 张涛 + * @date 2021年2月1日 + * @return + */ + public boolean isErrorRetry() { + return errorRetry; + } + + public void setErrorRetry(boolean errorRetry) { + this.errorRetry = errorRetry; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java new file mode 100644 index 0000000..b7ba819 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java @@ -0,0 +1,39 @@ +package org.dromara.settlement.api.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; + +/** + * 微服务接口返回结果状态 SUCCESS:成功 200 ERROR:失败 500 CONFIRM:需要确认 201 TIP:业务提示 202 + * NoPermission:无权限访问 203 + * + * @author 丁红博 + * + */ +public enum ResultCodeEnum { + SUCCESS(200), ERROR(500), CONFIRM(201), TIP(202), NoPermission(203); + int resultCode = 200; + + private ResultCodeEnum(int resultCode) { + this.resultCode = resultCode; + } + + public int Code() { + return resultCode; + } + + @JsonCreator // This is the factory method and must be static + public static ResultCodeEnum fromString(int string) { + if (string == 200) { + return ResultCodeEnum.SUCCESS; + } else if (string == 500) { + return ResultCodeEnum.ERROR; + } else if (string == 201) { + return ResultCodeEnum.CONFIRM; + } else if (string == 202) { + return ResultCodeEnum.TIP; + } else if (string == 203) { + return ResultCodeEnum.NoPermission; + } + return null; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java new file mode 100644 index 0000000..d91a2da --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java @@ -0,0 +1,125 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class SignZhifubao implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -6248121087874179082L; + + private Integer id; + + private Long unitId; + + private String appId; + + private String agreementNo; + + private String alipayLogonId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date validTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date signTime; + + private String status; + + private Date addTime; + + private Date editTime; + + private String signUrl; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAgreementNo() { + return agreementNo; + } + + public void setAgreementNo(String agreementNo) { + this.agreementNo = agreementNo; + } + + public String getAlipayLogonId() { + return alipayLogonId; + } + + public void setAlipayLogonId(String alipayLogonId) { + this.alipayLogonId = alipayLogonId; + } + + public Date getValidTime() { + return validTime; + } + + public void setValidTime(Date validTime) { + this.validTime = validTime; + } + + public Date getSignTime() { + return signTime; + } + + public void setSignTime(Date signTime) { + this.signTime = signTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getEditTime() { + return editTime; + } + + public void setEditTime(Date editTime) { + this.editTime = editTime; + } + + public String getSignUrl() { + return signUrl; + } + + public void setSignUrl(String signUrl) { + this.signUrl = signUrl; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java new file mode 100644 index 0000000..eae43ff --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java @@ -0,0 +1,221 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class TransactionLog implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -4881248715747858575L; + + private Long id; + + private Long unitId; + + private String orderNo; + + private Integer sourceAccId; + + private String sourceBankNo; + + private String sourceAccName; + + private String sourceCard; + + private Integer targetAccId; + + private String targetCard; + + private String targetBankNo; + + private String targetAccName; + + private String targetAccBankAddr; + + private String bankType; + + private Long amount; + + private Date addTime; + + private Short result; + + private String remark; + + private Date tranTime; + + private String reason; + + private String payReceipt; + + private String payReceiptId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public Integer getSourceAccId() { + return sourceAccId; + } + + public void setSourceAccId(Integer sourceAccId) { + this.sourceAccId = sourceAccId; + } + + public String getSourceBankNo() { + return sourceBankNo; + } + + public void setSourceBankNo(String sourceBankNo) { + this.sourceBankNo = sourceBankNo; + } + + public String getSourceCard() { + return sourceCard; + } + + public void setSourceCard(String sourceCard) { + this.sourceCard = sourceCard; + } + + public Integer getTargetAccId() { + return targetAccId; + } + + public void setTargetAccId(Integer targetAccId) { + this.targetAccId = targetAccId; + } + + public String getTargetCard() { + return targetCard; + } + + public void setTargetCard(String targetCard) { + this.targetCard = targetCard; + } + + public String getTargetBankNo() { + return targetBankNo; + } + + public void setTargetBankNo(String targetBankNo) { + this.targetBankNo = targetBankNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Short getResult() { + return result; + } + + public void setResult(Short result) { + this.result = result; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Date getTranTime() { + return tranTime; + } + + public void setTranTime(Date tranTime) { + this.tranTime = tranTime; + } + + public String getTargetAccName() { + return targetAccName; + } + + public void setTargetAccName(String targetAccName) { + this.targetAccName = targetAccName; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getTargetAccBankAddr() { + return targetAccBankAddr; + } + + public void setTargetAccBankAddr(String targetAccBankAddr) { + this.targetAccBankAddr = targetAccBankAddr; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getSourceAccName() { + return sourceAccName; + } + + public void setSourceAccName(String sourceAccName) { + this.sourceAccName = sourceAccName; + } + + public String getPayReceipt() { + return payReceipt; + } + + public void setPayReceipt(String payReceipt) { + this.payReceipt = payReceipt; + } + + public String getPayReceiptId() { + return payReceiptId; + } + + public void setPayReceiptId(String payReceiptId) { + this.payReceiptId = payReceiptId; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java new file mode 100644 index 0000000..33152b6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java @@ -0,0 +1,53 @@ +/** + +*

Title: UnitConfClass.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 读取大类 + * @author DHB + * + */ +public class UnitConfClass implements Serializable { + + private static final long serialVersionUID = -3960190254141791261L; + + private String class_name; + + private String class_alias; + + public String getClass_name() { + return class_name; + } + + public void setClass_name(String class_name) { + this.class_name = class_name; + } + + public String getClass_alias() { + return class_alias; + } + + public void setClass_alias(String class_alias) { + this.class_alias = class_alias; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java new file mode 100644 index 0000000..7d5c611 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java @@ -0,0 +1,146 @@ +/** + +*

Title: UnitConfDetail.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * @author DHB + * + */ +public class UnitConfDetail implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -5113641353439749673L; + + private Long conf_unit; + + private Integer conf_unit_type; + + private String class_name; + + private String class_alias; + + private String conf_group; + + private String conf_group_name; + + private String conf_item; + + private String conf_value; + + private String conf_remark; + + private Integer conf_is_editor; + + private Integer is_enable; + + + public Integer getConf_is_editor() { + return conf_is_editor; + } + + public void setConf_is_editor(Integer conf_is_editor) { + this.conf_is_editor = conf_is_editor; + } + + public Integer getIs_enable() { + return is_enable; + } + + public void setIs_enable(Integer is_enable) { + this.is_enable = is_enable; + } + + public Long getConf_unit() { + return conf_unit; + } + + public void setConf_unit(Long conf_unit) { + this.conf_unit = conf_unit; + } + + public Integer getConf_unit_type() { + return conf_unit_type; + } + + public void setConf_unit_type(Integer conf_unit_type) { + this.conf_unit_type = conf_unit_type; + } + + public String getClass_name() { + return class_name; + } + + public void setClass_name(String class_name) { + this.class_name = class_name; + } + + public String getClass_alias() { + return class_alias; + } + + public void setClass_alias(String class_alias) { + this.class_alias = class_alias; + } + + public String getConf_group() { + return conf_group; + } + + public void setConf_group(String conf_group) { + this.conf_group = conf_group; + } + + public String getConf_group_name() { + return conf_group_name; + } + + public void setConf_group_name(String conf_group_name) { + this.conf_group_name = conf_group_name; + } + + public String getConf_item() { + return conf_item; + } + + public void setConf_item(String conf_item) { + this.conf_item = conf_item; + } + + public String getConf_value() { + return conf_value; + } + + public void setConf_value(String conf_value) { + this.conf_value = conf_value; + } + + public String getConf_remark() { + return conf_remark; + } + + public void setConf_remark(String conf_remark) { + this.conf_remark = conf_remark; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java new file mode 100644 index 0000000..c04f373 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java @@ -0,0 +1,66 @@ +/** + +*

Title: UnitConfGroup.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 大类下面的组 + * @author DHB + * + */ +public class UnitConfGroup implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7082429896261327730L; + + private String conf_group; + + private String conf_group_name; + + private Integer is_enable; + + public String getConf_group() { + return conf_group; + } + + public void setConf_group(String conf_group) { + this.conf_group = conf_group; + } + + public String getConf_group_name() { + return conf_group_name; + } + + public void setConf_group_name(String conf_group_name) { + this.conf_group_name = conf_group_name; + } + + public Integer getIs_enable() { + return is_enable; + } + + public void setIs_enable(Integer is_enable) { + this.is_enable = is_enable; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java new file mode 100644 index 0000000..591ca44 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java @@ -0,0 +1,77 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 银行信息 + * @author 张涛 + * @date 2021年8月17日 + */ +public class BankCardInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -6422914129745338701L; + + private String card; + + private String name; + + private String type; + + private String typeName; + + private String expireDate; + + private String cardholder; + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public String getExpireDate() { + return expireDate; + } + + public void setExpireDate(String expireDate) { + this.expireDate = expireDate; + } + + public String getCardholder() { + return cardholder; + } + + public void setCardholder(String cardholder) { + this.cardholder = cardholder; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java new file mode 100644 index 0000000..8318170 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java @@ -0,0 +1,109 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 银行信息 + * @author 张涛 + * @date 2021年8月17日 + */ +public class BankInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 2373994781794561985L; + + private Integer bin_digits;//银行卡bin码长度 + private String city;//银行卡开户市 + private String type;//银行卡类型 + private String abbreviation;//银联支付网关简码 + private String bank;//银行名称 + private String province;//银行卡开户省 + private Integer card_digits;//银行卡号长度 + private String weburl;//银行官方网站 + private String card_name;//银行卡名称 + private String logo;//银行logo + private String tel;//银行官方客服电话 + private String isLuhn;//是否支持luhn校验 true-校验成功 false-校验失败 + private String card_bin;//银行卡bin码 + public Integer getBin_digits() { + return bin_digits; + } + public void setBin_digits(Integer bin_digits) { + this.bin_digits = bin_digits; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getAbbreviation() { + return abbreviation; + } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + public String getBank() { + return bank; + } + public void setBank(String bank) { + this.bank = bank; + } + public String getProvince() { + return province; + } + public void setProvince(String province) { + this.province = province; + } + public Integer getCard_digits() { + return card_digits; + } + public void setCard_digits(Integer card_digits) { + this.card_digits = card_digits; + } + public String getWeburl() { + return weburl; + } + public void setWeburl(String weburl) { + this.weburl = weburl; + } + public String getCard_name() { + return card_name; + } + public void setCard_name(String card_name) { + this.card_name = card_name; + } + public String getLogo() { + return logo; + } + public void setLogo(String logo) { + this.logo = logo; + } + public String getTel() { + return tel; + } + public void setTel(String tel) { + this.tel = tel; + } + public String getIsLuhn() { + return isLuhn; + } + public void setIsLuhn(String isLuhn) { + this.isLuhn = isLuhn; + } + public String getCard_bin() { + return card_bin; + } + public void setCard_bin(String card_bin) { + this.card_bin = card_bin; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java new file mode 100644 index 0000000..0f3b8fe --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java @@ -0,0 +1,43 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +public class CardIdBack implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 2651593151075888506L; + + private String issue; + + private String issueDate; + + private String expiryDate; + + public String getIssue() { + return issue; + } + + public void setIssue(String issue) { + this.issue = issue; + } + + public String getIssueDate() { + return issueDate; + } + + public void setIssueDate(String issueDate) { + this.issueDate = issueDate; + } + + public String getExpiryDate() { + return expiryDate; + } + + public void setExpiryDate(String expiryDate) { + this.expiryDate = expiryDate; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java new file mode 100644 index 0000000..a02ef79 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java @@ -0,0 +1,77 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 身份证正面 + * @author 张涛 + * @date 2021年8月17日 + */ +public class CardIdPositive implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 1103126175514709517L; + + private String address; + + private String birthday; + + private String name; + + private String code; + + private String sex; + + private String nation; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + +} diff --git a/ruoyi-api/ruoyi-api-system/pom.xml b/ruoyi-api/ruoyi-api-system/pom.xml new file mode 100644 index 0000000..02958f3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-system + + + ruoyi-api-system系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java new file mode 100644 index 0000000..89c3068 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java @@ -0,0 +1,20 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.vo.RemoteClientVo; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +public interface RemoteClientService { + + /** + * 根据客户端id获取客户端详情 + * + * @param clientId 客户端id + * @return 客户端对象 + */ + RemoteClientVo queryByClientId(String clientId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java new file mode 100644 index 0000000..59dd3e4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java @@ -0,0 +1,27 @@ +package org.dromara.system.api; + +import jakarta.validation.constraints.NotBlank; +import org.dromara.common.core.domain.R; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; + +/** + * 配置服务 + * + * @author Michelle.Chung + */ +public interface RemoteConfigService { + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 根据域名获取站点配置信息 + * @param domain 域名地址 + * @return + */ + public RemoteSysUnitDomainVo queryByDomainName(String domain); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java new file mode 100644 index 0000000..ceac940 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java @@ -0,0 +1,20 @@ +package org.dromara.system.api; + +/** + * 数据权限服务 + * + * @author Lion Li + */ +public interface RemoteDataScopeService { + + /** + * 获取角色自定义权限语句 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门和下级权限语句 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java new file mode 100644 index 0000000..095fd7c --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java @@ -0,0 +1,18 @@ +package org.dromara.system.api; + +/** + * 部门服务 + * + * @author Lion Li + */ +public interface RemoteDeptService { + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java new file mode 100644 index 0000000..142dc45 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java @@ -0,0 +1,21 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; + +/** + * 字典服务 + * + * @author Lion Li + */ +public interface RemoteDictService { + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java new file mode 100644 index 0000000..af084a2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java @@ -0,0 +1,26 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; + +/** + * 日志服务 + * + * @author Lion Li + */ +public interface RemoteLogService { + + /** + * 保存系统日志 + * + * @param sysOperLog 日志实体 + */ + void saveLog(RemoteOperLogBo sysOperLog); + + /** + * 保存访问记录 + * + * @param sysLogininfor 访问实体 + */ + void saveLogininfor(RemoteLogininforBo sysLogininfor); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java new file mode 100644 index 0000000..d83c873 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java @@ -0,0 +1,19 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; + +/** + * 通知服务 + * + * @author Lion Li + */ +public interface RemoteNoticeService { + + /** + * 添加通知 + * @param noticeVo + */ + void addNotice(RemoteSysNoticeVo noticeVo); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java new file mode 100644 index 0000000..85d148f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java @@ -0,0 +1,14 @@ +package org.dromara.system.api; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteOrderNumService + * @description + * @create 2024-07-16 14:56 + */ +public interface RemoteOrderNumService { + + + Long getOrderNum(String bpmType,int size ); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java new file mode 100644 index 0000000..ff61c12 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java @@ -0,0 +1,35 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; + +import java.util.List; + +/** + * 社会化关系服务 + * + * @author Michelle.Chung + */ +public interface RemoteSocialService { + + /** + * 根据 authId 查询用户信息 + */ + List selectByAuthId(String authId); + + /** + * 保存社会化关系 + */ + void insertByBo(RemoteSocialBo bo); + + /** + * 更新社会化关系 + */ + void updateByBo(RemoteSocialBo bo); + + /** + * 删除社会化关系 + */ + Boolean deleteWithValidById(Long socialId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java new file mode 100644 index 0000000..5cfcc05 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java @@ -0,0 +1,26 @@ +package org.dromara.system.api; + + +import org.dromara.system.api.domain.vo.RemoteTenantVo; + +import java.util.List; + +/** + * @author zhujie + */ +public interface RemoteTenantService { + + /** + * 根据租户id获取租户详情 + * @param tenantId 租户id + * @return 结果 + */ + RemoteTenantVo queryByTenantId(String tenantId); + + /** + * 获取租户列表 + * @return 结果 + */ + List queryList(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java new file mode 100644 index 0000000..1997a3b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java @@ -0,0 +1,123 @@ +package org.dromara.system.api; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.api.model.XcxLoginUser; + +/** + * 用户服务 + * + * @author Lion Li + */ +public interface RemoteUserService { + + /** + * 通过用户名查询用户信息 + * + * @param username 用户名 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfo(String username, String tenantId) throws UserException; + + /** + * 通过用户id查询用户信息 + * + * @param userId 用户id + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfo(Long userId, String tenantId) throws UserException; + + /** + * 通过手机号查询用户信息 + * + * @param phonenumber 手机号 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException; + + /** + * 通过邮箱查询用户信息 + * + * @param email 邮箱 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException; + + /** + * 通过openid查询用户信息 + * + * @param openid openid + * @return 结果 + */ + XcxLoginUser getUserInfoByOpenid(String openid) throws UserException; + + /** + * 注册用户信息 + * + * @param remoteUserBo 用户信息 + * @return 结果 + */ + Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException; + + /** + * 通过userId查询用户账户 + * + * @param userId 用户id + * @return 结果 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户名查询用户信息 + * @param userName 用户名 + * @return + */ + RemoteSysUserVo selectUserByName(String userName); + + /** + * 通过用户名查询用户信息 + * @param userId 用户id + * @return + */ + RemoteSysUserVo selectUserById(long userId); + + /** + * 通过用户ID查询用户昵称 + * + * @param userId 用户id + * @return 结果 + */ + String selectNicknameById(Long userId); + + /** + * 更新用户信息 + * + * @param userId 用户ID + * @param ip IP地址 + */ + void recordLoginInfo(Long userId, String ip); + + + /*** + * 添加运营商,企业,代理商,服务商管理员账号 + * @param userBo + * @return + */ + int insertBusUser(RemoteUserBo userBo); + + + /**** + * 更新用户信息 + * @param userBo + * @return + */ + int updateUserResetPayTag(Long userId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java new file mode 100644 index 0000000..cb6081f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java @@ -0,0 +1,142 @@ +package org.dromara.system.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +public class RemoteSysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + /** + * 短信配置 + */ + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 微信公众号配置 + */ + private String wxPubConfig; + + + private String weChatThirdParams; + + private String weChatDomainName; + + /*** + * 大鸿签参数配置 + */ + private String signConfig; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java new file mode 100644 index 0000000..4ad3c06 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java @@ -0,0 +1,72 @@ +package org.dromara.system.api.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 当前在线会话 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class SysUserOnline implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java new file mode 100644 index 0000000..ac2c411 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java @@ -0,0 +1,90 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteLogininforBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java new file mode 100644 index 0000000..aad49f6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java @@ -0,0 +1,120 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteOperLogBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java new file mode 100644 index 0000000..78daf2f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java @@ -0,0 +1,129 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 社会化关系业务对象 sys_social + * + * @author Michelle.Chung + */ +@Data +@NoArgsConstructor +public class RemoteSocialBo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long id; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java new file mode 100644 index 0000000..d331b77 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java @@ -0,0 +1,150 @@ +package org.dromara.system.api.domain.bo; + + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +public class RemoteUserBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + private Long avatar; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 数据权限 当前角色ID + */ + private Integer roleId; + + + + //角色名称 + private String roleName; + + //权限范围(1:角色 2:个人 + private Integer roleDataRange; + + //主体编码 + private String busNo; + + //主体id(结算中心id或运营商id或渠道商id或商户id) + private Long busId; + + + private Long createBy; + + private Date createTime; + + + //是否重置支付密码(0:否,1:是) + private Integer isResetPaypass; + + + + public RemoteUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java new file mode 100644 index 0000000..400f56b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java @@ -0,0 +1,71 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + */ +@Data +public class RemoteClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java new file mode 100644 index 0000000..294d3e3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java @@ -0,0 +1,76 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +public class RemoteDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java new file mode 100644 index 0000000..71e8d58 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java @@ -0,0 +1,135 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import java.io.Serial; +import java.io.Serializable; + + +/** + * 社会化关系视图对象 sys_social + * + * @author thiszhc + */ +@Data +public class RemoteSocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java new file mode 100644 index 0000000..7a7783b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java @@ -0,0 +1,92 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import org.dromara.common.core.enums.BusRole; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +public class RemoteSysNoticeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + public RemoteSysNoticeVo(){} + + public RemoteSysNoticeVo(String noticeTitle, String noticeContent, Integer unitId, BusRole role) { + this.noticeTitle = noticeTitle; + this.noticeContent = noticeContent; + this.unitId = unitId; + this.noticeType = "1";//通知 + this.roleId = Long.parseLong(role.getId()+""); + this.roleName = role.getName(); + } + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java new file mode 100644 index 0000000..da74de2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java @@ -0,0 +1,159 @@ +package org.dromara.system.api.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +public class RemoteSysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 是否登录过(0:否 1:是) + */ + private Integer loginFirst; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID(作废) + */ + private Long roleId; + + private Long curRoleId; + + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java new file mode 100644 index 0000000..b9387f9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java @@ -0,0 +1,91 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 + * + * @author zhujie + */ +@Data +public class RemoteTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java new file mode 100644 index 0000000..b91a7bb --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java @@ -0,0 +1,209 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +public class LoginUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String nickname; + + /** + * 密码 + */ + private String password; + + /** + * 角色对象 + */ + private List roles; + + + /** + * 数据权限 当前角色ID(作废) + */ + private Long roleId; + + /** + * 当前角色id + */ + private Long curRoleId; + + /** + * 当前角色名称 + */ + private String curRoleName; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:38 + * 说明:角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + **/ + private Integer busRole; + + /** + * 主体编码(结算中心id或运营商id或渠道商id或商户id) + */ + private String busNo; + + + /** + * 选择的服务商id + */ + private Long sydId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 手机号 + */ + private String phonenumber; + + private String ids; + + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java new file mode 100644 index 0000000..71b9af3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java @@ -0,0 +1,42 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RoleDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java new file mode 100644 index 0000000..3982e2e --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java @@ -0,0 +1,27 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 小程序登录用户身份权限 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class XcxLoginUser extends LoginUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * openid + */ + private String openid; + +} diff --git a/ruoyi-auth/Dockerfile b/ruoyi-auth/Dockerfile new file mode 100644 index 0000000..f6721d2 --- /dev/null +++ b/ruoyi-auth/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/auth/logs \ + /ruoyi/auth/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/auth + +ENV SERVER_PORT=9210 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-auth.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-auth \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml new file mode 100644 index 0000000..c2750e3 --- /dev/null +++ b/ruoyi-auth/pom.xml @@ -0,0 +1,156 @@ + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + ruoyi-auth + + + ruoyi-auth 认证授权中心 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + cn.hutool + hutool-captcha + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-social + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + org.dromara + ruoyi-api-resource + + + + org.dromara + ruoyi-api-mp + + + + + org.dromara + ruoyi-common-loadbalancer + + + + org.dromara + ruoyi-common-sensitive + + + + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java b/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java new file mode 100644 index 0000000..9a2896a --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java @@ -0,0 +1,25 @@ +package org.dromara.auth; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 认证授权中心 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiAuthApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiAuthApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 认证授权中心启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java b/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java new file mode 100644 index 0000000..feb4cdf --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java @@ -0,0 +1,88 @@ +package org.dromara.auth.captcha; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.math.Calculator; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.RandomUtil; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; + +/** + * 无符号计算生成器 + * + * @author Lion Li + */ +public class UnsignedMathGenerator implements CodeGenerator { + + @Serial + private static final long serialVersionUID = -5514819971774091076L; + + private static final String OPERATORS = "+-*"; + + /** + * 参与计算数字最大长度 + */ + private final int numberLength; + + /** + * 构造 + */ + public UnsignedMathGenerator() { + this(2); + } + + /** + * 构造 + * + * @param numberLength 参与计算最大数字位数 + */ + public UnsignedMathGenerator(int numberLength) { + this.numberLength = numberLength; + } + + @Override + public String generate() { + final int limit = getLimit(); + int a = RandomUtil.randomInt(limit); + int b = RandomUtil.randomInt(limit); + String max = Integer.toString(Math.max(a,b)); + String min = Integer.toString(Math.min(a,b)); + max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); + min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); + + return max + RandomUtil.randomChar(OPERATORS) + min + '='; + } + + @Override + public boolean verify(String code, String userInputCode) { + int result; + try { + result = Integer.parseInt(userInputCode); + } catch (NumberFormatException e) { + // 用户输入非数字 + return false; + } + + final int calculateResult = (int) Calculator.conversion(code); + return result == calculateResult; + } + + /** + * 获取验证码长度 + * + * @return 验证码长度 + */ + public int getLength() { + return this.numberLength * 2 + 2; + } + + /** + * 根据长度获取参与计算数字最大值 + * + * @return 最大值 + */ + private int getLimit() { + return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java b/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java new file mode 100644 index 0000000..5880016 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java @@ -0,0 +1,62 @@ +package org.dromara.auth.config; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.awt.*; + +/** + * 验证码配置 + * + * @author Lion Li + */ +@Configuration +public class CaptchaConfig { + + private static final int WIDTH = 160; + private static final int HEIGHT = 60; + private static final Color BACKGROUND = Color.PINK; + private static final Font FONT = new Font("Arial", Font.BOLD, 48); + + /** + * 圆圈干扰验证码 + */ + @Lazy + @Bean + public CircleCaptcha circleCaptcha() { + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 线段干扰的验证码 + */ + @Lazy + @Bean + public LineCaptcha lineCaptcha() { + LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 扭曲干扰验证码 + */ + @Lazy + @Bean + public ShearCaptcha shearCaptcha() { + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java new file mode 100644 index 0000000..63d002c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java @@ -0,0 +1,79 @@ +package org.dromara.auth.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.util.IdUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.auth.domain.vo.CaptchaVo; +import org.dromara.auth.enums.CaptchaType; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; + +/** + * 验证码操作处理 + * + * @author Lion Li + */ +@SaIgnore +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +public class CaptchaController { + + private final CaptchaProperties captchaProperties; + + /** + * 生成验证码 + */ + @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) + @GetMapping("/code") + public R getCode() { + CaptchaVo captchaVo = new CaptchaVo(); + boolean captchaEnabled = captchaProperties.getEnabled(); + if (!captchaEnabled) { + captchaVo.setCaptchaEnabled(false); + return R.ok(captchaVo); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; + // 生成验证码 + CaptchaType captchaType = captchaProperties.getType(); + boolean isMath = CaptchaType.MATH == captchaType; + Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); + CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); + AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); + captcha.setGenerator(codeGenerator); + captcha.createCode(); + String code = captcha.getCode(); + if (isMath) { + ExpressionParser parser = new SpelExpressionParser(); + Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); + code = exp.getValue(String.class); + } + RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.getImageBase64()); + return R.ok(captchaVo); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java new file mode 100644 index 0000000..07a9336 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -0,0 +1,317 @@ +package org.dromara.auth.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.*; +import org.dromara.auth.form.RegisterBody; +import org.dromara.auth.form.SocialLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.utils.*; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.net.URL; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * token 控制 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +public class TokenController { + + private final SocialProperties socialProperties; + private final SysLoginService sysLoginService; + private final ScheduledExecutorService scheduledExecutorService; + + @DubboReference + private final RemoteConfigService remoteConfigService; + @DubboReference + private final RemoteTenantService remoteTenantService; + @DubboReference + private final RemoteClientService remoteClientService; + @DubboReference + private final RemoteSocialService remoteSocialService; + + @DubboReference(stub = "true") + private final RemoteMessageService remoteMessageService; + + /** + * 登录方法(登录第一步) + * + * @param body 登录信息 + * @return 结果 + */ + @ApiEncrypt + @PostMapping("/tlogin") + public R tlogin(@RequestBody String body) { + return R.ok(sysLoginService.tlogin(body)); + } + + /** + * 获取登录短信验证码 + * @param domain 域名 + * @param id 用户id + * @return + */ + @PostMapping("/loginSmsCode") + public R loginSmsCode(@NotBlank(message = "站点名称不能为空") String domain,long id) { + sysLoginService.loginSmsCode(domain,id); + return R.ok(); + } + + /** + * 获取微信登录验证二维码 + * @param domain 域名 + * @param id 用户id + * @return + */ + @PostMapping("/loginWxPubCode") + public R loginWxPubCode(@NotBlank(message = "站点名称不能为空") String domain, long id, Long sydId) { + return R.ok(sysLoginService.loginWxPubCode(domain,id,sydId)); + } + + /** + * 获取微信登录结果 + * @param id 用户id + * @return + */ + @PostMapping("/loginWxPubResult") + public R loginWxPubResult(long id) { + return R.ok(sysLoginService.loginWxPubResult(id)); + } + + /** + * 登录方法 + * + * @param body 登录信息 + * @return 结果 + */ + @ApiEncrypt + @PostMapping("/login") + public R login(@RequestBody String body) { + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(clientVo) || !StringUtils.contains(clientVo.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (!UserConstants.NORMAL.equals(clientVo.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + //sysLoginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); + + Long userId = LoginHelper.getUserId(); + scheduledExecutorService.schedule(() -> { + try { + remoteMessageService.sendMessage(userId, "欢迎登录flexible-employment微服务管理系统"); + } catch (Exception ignored) { + } + }, 3, TimeUnit.SECONDS); + return R.ok(loginVo); + } + + + + + /** + * 公众号登录方法 + * + * @param body 登录信息 + * @return 结果 + */ +// @ApiEncrypt + @PostMapping("/mpLogin") + public R mpLogin(@RequestBody String body) { + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(clientVo) || !StringUtils.contains(clientVo.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (!UserConstants.NORMAL.equals(clientVo.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + //sysLoginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); + +// Long userId = LoginHelper.getUserId(); +// scheduledExecutorService.schedule(() -> { +// try { +// remoteMessageService.sendMessage(userId, "欢迎登录flexible-employment微服务管理系统"); +// } catch (Exception ignored) { +// } +// }, 3, TimeUnit.SECONDS); + return R.ok(loginVo); + } + + + + + + /** + * 第三方登录请求 + * + * @param source 登录来源 + * @return 结果 + */ + @GetMapping("/binding/{source}") + public R authBinding(@PathVariable("source") String source) { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + return R.fail(source + "平台账号暂不支持"); + } + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); + String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); + return R.ok("操作成功", authorizeUrl); + } + + /** + * 第三方登录回调业务处理 绑定授权 + * + * @param loginBody 请求体 + * @return 结果 + */ + @PostMapping("/social/callback") + public R socialCallback(@RequestBody SocialLoginBody loginBody) { + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + sysLoginService.socialRegister(authUserData); + return R.ok(); + } + + + /** + * 取消授权 + * + * @param socialId socialId + */ + @DeleteMapping(value = "/unlock/{socialId}") + public R unlockSocial(@PathVariable Long socialId) { + Boolean rows = remoteSocialService.deleteWithValidById(socialId); + return rows ? R.ok() : R.fail("取消授权失败"); + } + + /** + * 登出方法 + */ + @PostMapping("logout") + public R logout() { + sysLoginService.logout(); + return R.ok(); + } + + + + + /** + * 公众号登出方法 + */ + @PostMapping("mpLogout") + public R mpLogout() { + sysLoginService.mpLogout(); + return R.ok(); + } + + + + + + /** + * 用户注册 + */ + @ApiEncrypt + @PostMapping("register") + public R register(@RequestBody RegisterBody registerBody) { + if (!remoteConfigService.selectRegisterEnabled(registerBody.getTenantId())) { + return R.fail("当前系统没有开启注册功能!"); + } + // 用户注册 + sysLoginService.register(registerBody); + return R.ok(); + } + + /** + * 登录页面租户下拉框 + * + * @return 租户列表 + */ + @GetMapping("/tenant/list") + public R tenantList(HttpServletRequest request) throws Exception { + List tenantList = remoteTenantService.queryList(); + List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + // 获取域名 + String host; + String referer = request.getHeader("referer"); + if (StringUtils.isNotBlank(referer)) { + // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试 + host = referer.split("//")[1].split("/")[0]; + } else { + host = new URL(request.getRequestURL().toString()).getHost(); + } + // 根据域名进行筛选 + List list = StreamUtils.filter(voList, vo -> + StringUtils.equals(vo.getDomain(), host)); + // 返回对象 + LoginTenantVo vo = new LoginTenantVo(); + vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + vo.setTenantEnabled(TenantHelper.isEnable()); + return R.ok(vo); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java new file mode 100644 index 0000000..7888f2c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java @@ -0,0 +1,16 @@ +package org.dromara.auth.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.auth.domain.vo.TenantListVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 租户vo转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TenantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java new file mode 100644 index 0000000..2a4c0bd --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java @@ -0,0 +1,25 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 验证码信息 + * + * @author Michelle.Chung + */ +@Data +public class CaptchaVo { + + /** + * 是否开启验证码 + */ + private Boolean captchaEnabled = true; + + private String uuid; + + /** + * 验证码图片 + */ + private String img; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java new file mode 100644 index 0000000..fcfdcc3 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java @@ -0,0 +1,25 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 登录租户对象 + * + * @author Michelle.Chung + */ +@Data +public class LoginTenantVo { + + /** + * 租户开关 + */ + private Boolean tenantEnabled; + + /** + * 租户对象列表 + */ + private List voList; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java new file mode 100644 index 0000000..e4bea14 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java @@ -0,0 +1,54 @@ +package org.dromara.auth.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class LoginVo { + + /** + * 授权令牌 + */ + @JsonProperty("access_token") + private String accessToken; + + /** + * 刷新令牌 + */ + @JsonProperty("refresh_token") + private String refreshToken; + + /** + * 授权令牌 access_token 的有效期 + */ + @JsonProperty("expire_in") + private Long expireIn; + + /** + * 刷新令牌 refresh_token 的有效期 + */ + @JsonProperty("refresh_expire_in") + private Long refreshExpireIn; + + /** + * 应用id + */ + @JsonProperty("client_id") + private String clientId; + + /** + * 令牌权限 + */ + private String scope; + + /** + * 用户 openid + */ + private String openid; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java new file mode 100644 index 0000000..783df0f --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java @@ -0,0 +1,20 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 微信登录信息 + */ +@Data +public class LoginWxPubVo { + + /** + * 微信登录二维码地址 + */ + private String qrcode; + + /** + * 微信登录id + */ + private Long id; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java new file mode 100644 index 0000000..81983a2 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java @@ -0,0 +1,32 @@ +package org.dromara.auth.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class TLoginVo { + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 用户id + */ + private Long id; + + /** + * 服务商id + */ + private Long sydId; + + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phone; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java new file mode 100644 index 0000000..b993b37 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java @@ -0,0 +1,19 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 租户列表 + * + * @author zhujie + */ +@Data +public class TenantListVo { + + private String tenantId; + + private String companyName; + + private String domain; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java new file mode 100644 index 0000000..b387aed --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java @@ -0,0 +1,35 @@ +package org.dromara.auth.enums; + +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 验证码类别 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaCategory { + + /** + * 线段干扰 + */ + LINE(LineCaptcha.class), + + /** + * 圆圈干扰 + */ + CIRCLE(CircleCaptcha.class), + + /** + * 扭曲干扰 + */ + SHEAR(ShearCaptcha.class); + + private final Class clazz; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java new file mode 100644 index 0000000..b663345 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java @@ -0,0 +1,29 @@ +package org.dromara.auth.enums; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.captcha.generator.RandomGenerator; +import org.dromara.auth.captcha.UnsignedMathGenerator; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 验证码类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaType { + + /** + * 数字 + */ + MATH(UnsignedMathGenerator.class), + + /** + * 字符 + */ + CHAR(RandomGenerator.class); + + private final Class clazz; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java new file mode 100644 index 0000000..931e236 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java @@ -0,0 +1,32 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 邮件登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class EmailLoginBody extends LoginBody { + + /** + * 邮箱 + */ + @NotBlank(message = "{user.email.not.blank}") + @Email(message = "{user.email.not.valid}") + private String email; + + /** + * 邮箱code + */ + @NotBlank(message = "{email.code.not.blank}") + private String emailCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java new file mode 100644 index 0000000..edb7ab2 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java @@ -0,0 +1,34 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; +import org.hibernate.validator.constraints.Length; + +import static org.dromara.common.core.constant.UserConstants.*; + +/** + * 密码登录对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PasswordLoginBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") + private String password; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java new file mode 100644 index 0000000..386c0fc --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java @@ -0,0 +1,36 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; +import org.hibernate.validator.constraints.Length; + +import static org.dromara.common.core.constant.UserConstants.*; + +/** + * 用户注册对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RegisterBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") + private String password; + + private String userType; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java new file mode 100644 index 0000000..8b9751d --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java @@ -0,0 +1,30 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 短信登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsLoginBody extends LoginBody { + + /** + * 手机号 + */ + //@NotBlank(message = "{user.phonenumber.not.blank}") + private String phonenumber; + + /** + * 短信code + */ + @NotBlank(message = "{sms.code.not.blank}") + private String smsCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java new file mode 100644 index 0000000..cbd61c9 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java @@ -0,0 +1,36 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SocialLoginBody extends LoginBody { + + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}") + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}") + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}") + private String socialState; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java new file mode 100644 index 0000000..c80be35 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java @@ -0,0 +1,24 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 微信公众号登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxPubLoginBody extends LoginBody { + + @NotBlank(message = "微信授权code不能为空") + private String wxcode; + + @NotBlank(message = "站点名称不能为空") + private String domain; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java new file mode 100644 index 0000000..c68306c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java @@ -0,0 +1,29 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class XcxLoginBody extends LoginBody { + + /** + * 小程序id(多个小程序时使用) + */ + private String appid; + + /** + * 小程序code + */ + @NotBlank(message = "{xcx.code.not.blank}") + private String xcxCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java new file mode 100644 index 0000000..0c7d2e0 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java @@ -0,0 +1,199 @@ +package org.dromara.auth.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.SysUserOnline; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.concurrent.ScheduledExecutorService; + +/** + * 用户行为 侦听器的实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + private final SaTokenConfig tokenConfig; + private final ScheduledExecutorService scheduledExecutorService; + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteMessageService remoteMessageService; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + LoginUser user = LoginHelper.getLoginUser(); + LoginMpUser mpUser = MpLoginHelper.getLoginUser(); + if(user != null){ + SysUserOnline userOnline = new SysUserOnline(); + userOnline.setIpaddr(ip); + userOnline.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + userOnline.setBrowser(userAgent.getBrowser().getName()); + userOnline.setOs(userAgent.getOs().getName()); + userOnline.setLoginTime(System.currentTimeMillis()); + userOnline.setTokenId(tokenValue); + userOnline.setUserName(user.getUsername()); + userOnline.setClientKey(user.getClientKey()); + userOnline.setDeviceType(user.getDeviceType()); + if (ObjectUtil.isNotNull(user.getDeptName())) { + userOnline.setDeptName(user.getDeptName()); + } + if (tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(tokenConfig.getTimeout())); + } + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(user.getTenantId()); + logininforEvent.setUsername(user.getUsername()); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + remoteUserService.recordLoginInfo(user.getUserId(), ServletUtils.getClientIP()); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + + }else{ + SysUserOnline userOnline = new SysUserOnline(); + userOnline.setIpaddr(ip); + userOnline.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + userOnline.setBrowser(userAgent.getBrowser().getName()); + userOnline.setOs(userAgent.getOs().getName()); + userOnline.setLoginTime(System.currentTimeMillis()); + userOnline.setTokenId(tokenValue); + userOnline.setUserName(mpUser.getPhone()); + userOnline.setClientKey(mpUser.getClientKey()); + userOnline.setDeviceType(mpUser.getDeviceType()); + + if (tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(tokenConfig.getTimeout())); + } + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(mpUser.getTenantId()); + logininforEvent.setUsername(mpUser.getPhone()); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + remoteUserService.recordLoginInfo(mpUser.getUserId(), ServletUtils.getClientIP()); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + + } + + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId, String service) { + } + + /** + * 每次打开二级认证时触发 + */ + @Override + public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCloseSafe(String loginType, String tokenValue, String service) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + /** + * 每次Token续期时触发 + */ + @Override + public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java b/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java new file mode 100644 index 0000000..1cd7098 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java @@ -0,0 +1,45 @@ +package org.dromara.auth.properties; + +import org.dromara.auth.enums.CaptchaCategory; +import org.dromara.auth.enums.CaptchaType; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 验证码配置 + * + * @author ruoyi + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.captcha") +public class CaptchaProperties { + /** + * 验证码类型 + */ + private CaptchaType type; + + /** + * 验证码类别 + */ + private CaptchaCategory category; + + /** + * 数字验证码位数 + */ + private Integer numberLength; + + /** + * 字符验证码长度 + */ + private Integer charLength; + + /** + * 验证码开关 + */ + private Boolean enabled; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java b/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java new file mode 100644 index 0000000..5960d71 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java @@ -0,0 +1,29 @@ +package org.dromara.auth.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 用户密码配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "user.password") +public class UserPasswordProperties { + + /** + * 密码最大错误次数 + */ + private Integer maxRetryCount; + + /** + * 密码锁定时间(默认10分钟) + */ + private Integer lockTime; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java new file mode 100644 index 0000000..0bc3657 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java @@ -0,0 +1,35 @@ +package org.dromara.auth.service; + +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.system.api.domain.vo.RemoteClientVo; + +/** + * 授权策略 + * + * @author Michelle.Chung + */ +public interface IAuthStrategy { + + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + */ + static LoginVo login(String body, RemoteClientVo client, String grantType) { + // 授权类型和客户端id + String beanName = grantType + BASE_NAME; + if (!SpringUtils.containsBean(beanName)) { + throw new ServiceException("授权类型不正确!"); + } + IAuthStrategy instance = SpringUtils.getBean(beanName); + return instance.login(body, client); + } + + /** + * 登录 + */ + LoginVo login(String body, RemoteClientVo client); + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java new file mode 100644 index 0000000..2c25355 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java @@ -0,0 +1,422 @@ +package org.dromara.auth.service; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthUser; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.domain.vo.LoginWxPubVo; +import org.dromara.auth.domain.vo.TLoginVo; +import org.dromara.auth.form.PasswordLoginBody; +import org.dromara.auth.form.RegisterBody; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.auth.properties.UserPasswordProperties; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.enums.TenantStatus; +import org.dromara.common.core.enums.UserType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.*; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.common.tenant.exception.TenantException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Supplier; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class SysLoginService { + + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteTenantService remoteTenantService; + @DubboReference + private RemoteSocialService remoteSocialService; + + @DubboReference + private final RemoteSmsService remoteSmsService; + + @DubboReference + private final RemoteWeiXinService remoteWeiXinService; + + @DubboReference + private RemoteFileService remoteFileService; + + @Autowired + private UserPasswordProperties userPasswordProperties; + @Autowired + private final CaptchaProperties captchaProperties; + + + @Value("${weixin.scanUrl}") + private String scanUrl; + + /** + * 绑定第三方用户 + * + * @param authUserData 授权响应实体 + */ + public void socialRegister(AuthUser authUserData) { + String authId = authUserData.getSource() + authUserData.getUuid(); + // 第三方用户信息 + RemoteSocialBo bo = BeanUtil.toBean(authUserData, RemoteSocialBo.class); + BeanUtil.copyProperties(authUserData.getToken(), bo); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authId); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + // 查询是否已经绑定用户 + List list = remoteSocialService.selectByAuthId(authId); + if (CollUtil.isEmpty(list)) { + // 没有绑定用户, 新增用户信息 + remoteSocialService.insertByBo(bo); + } else { + // 更新用户信息 + bo.setId(list.get(0).getId()); + remoteSocialService.updateByBo(bo); + } + } + + /** + * 退出登录 + */ + public void logout() { + try { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + + + /** + * 退出登录 + */ + public void mpLogout() { + try { + LoginMpUser loginUser = MpLoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && MpLoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getPhone(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + /** + * 注册 + */ + public void register(RegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + // 校验用户类型是否存在 + String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); + + boolean captchaEnabled = captchaProperties.getEnabled(); + // 验证码开关 + if (captchaEnabled) { + validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); + } + + // 注册用户信息 + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setTenantId(tenantId); + remoteUserBo.setUserName(username); + remoteUserBo.setNickName(username); + remoteUserBo.setPassword(BCrypt.hashpw(password)); + remoteUserBo.setUserType(userType); + + boolean regFlag = remoteUserService.registerUserInfo(remoteUserBo); + if (!regFlag) { + throw new UserException("user.register.error"); + } + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + public void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + * @return + */ + public void recordLogininfor(String tenantId, String username, String status, String message) { + // 封装对象 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + + /** + * 登录校验 + */ + public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { + String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; + String loginFail = Constants.LOGIN_FAIL; + Integer maxRetryCount = userPasswordProperties.getMaxRetryCount(); + Integer lockTime = userPasswordProperties.getLockTime(); + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定登录 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } else { + // 未达到规定错误次数 + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); + throw new UserException(loginType.getRetryLimitCount(), errorNumber); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + } + + /** + * 校验租户 + * + * @param tenantId 租户ID + */ + public void checkTenant(String tenantId) { + if (!TenantHelper.isEnable()) { + return; + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return; + } + if (StringUtils.isBlank(tenantId)) { + throw new TenantException("tenant.number.not.blank"); + } + RemoteTenantVo tenant = remoteTenantService.queryByTenantId(tenantId); + if (ObjectUtil.isNull(tenant)) { + log.info("登录租户:{} 不存在.", tenantId); + throw new TenantException("tenant.not.exists"); + } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) { + log.info("登录租户:{} 已被停用.", tenantId); + throw new TenantException("tenant.blocked"); + } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) + && new Date().after(tenant.getExpireTime())) { + log.info("登录租户:{} 已超过有效期.", tenantId); + throw new TenantException("tenant.expired"); + } + } + + public TLoginVo tlogin(String body){ + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + // 验证码开关 + if (captchaProperties.getEnabled()) { + validateCaptcha(tenantId, username, code, uuid); + } + RemoteSysUserVo loginUser = remoteUserService.selectUserByName(username); + checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, loginUser.getPassword())); + TLoginVo rtn = new TLoginVo(); + rtn.setLoginType(loginUser.getLoginType()); + rtn.setPhone(loginUser.getPhonenumber()); + rtn.setId(loginUser.getUserId()); + rtn.setSydId(loginBody.getSydId()); + return rtn; + } + + /** + * 获取登录短信验证码 + * @param domain 域名 + * @param id 用户id + * @return + */ + public Boolean loginSmsCode(String domain, long id){ + RemoteSysUserVo user = remoteUserService.selectUserById(id); + if(user == null){ + throw new ServiceException("用户异常,请重新登录"); + } + SmsType smsType = SmsType.getSmsTypeByRole(user.getCurRoleId()); + if(smsType == null){ + throw new ServiceException("用户角色异常,请重新登录"); + } + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + LinkedHashMap map = new LinkedHashMap<>(); + map.put("code", code); + map.put("expirs", smsType.getExpireTime() + ""); + RemoteSms sysSms = remoteSmsService.send(domain,user.getPhonenumber(),smsType,map); + return sysSms.getIsSuccess(); + + } + + /** + * 获取微信登录验证二维码 + * @param domain 域名 + * @param id 用户id + * @return + */ + public LoginWxPubVo loginWxPubCode(String domain, long id, Long sydId){ + RemoteSysUserVo user = remoteUserService.selectUserById(id); + if(user == null){ + throw new ServiceException("用户异常,请重新登录"); + } + SmsType smsType = SmsType.getSmsTypeByRole(user.getCurRoleId()); + if(smsType == null){ + throw new ServiceException("用户角色异常,请重新登录"); + } + LoginWxPubVo rtn = new LoginWxPubVo(); + String key = smsType.getCacheKey(user.getUserId().toString()); + String code = RandomUtil.randomNumbers(4); + Long wxLoginId = Long.parseLong((new Date().getTime()+"") + (id+""));//此次微信登录id + String redirectUri = scanUrl+"/loginCode.html"+"?ncode="+code+"&id="+wxLoginId+"&sydId="+(sydId != null ? sydId : "")+"&domain="+ Base64.encode(domain); +// String redirectUri = domain + "/loginWxPub?ncode="+code+"&id="+wxLoginId+"&sydId="+(sydId != null ? sydId : ""); + String qrcodeUrl = remoteWeiXinService.genPubAuthQrcode(domain,redirectUri); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + R loginResultVo = new R(); + loginResultVo.setCode(0);//等待扫码中 + loginResultVo.setData(new LoginVo()); + loginResultVo.getData().setClientId(id+"");//存入登录用户id + RedisUtils.setCacheObject(getWxPubLoginResultCacheKey(wxLoginId), loginResultVo, Duration.ofMinutes(smsType.getExpireTime()+1)); + rtn.setQrcode(qrcodeUrl); + rtn.setId(wxLoginId); + return rtn; + } + + /** + * 获取微信登录结果缓存key + * @param id 用户id + * @return + */ + public String getWxPubLoginResultCacheKey(long id){ + return GlobalConstants.CAPTCHA_CODE_KEY + ":weixinpub:"+ id; + } + + /** + * 获取微信登录结果 + * @param id 用户id + * @return + */ + public LoginVo loginWxPubResult(long id){ + String key = getWxPubLoginResultCacheKey(id); + R loginResultVo = RedisUtils.getCacheObject(key); + if (loginResultVo == null){ + throw new ServiceException("二维码已过期,请重新登录"); + } + if(loginResultVo.getCode() == 0){//等待扫码中 + return null; + } + if (R.isError(loginResultVo)){ + throw new ServiceException(loginResultVo.getMsg()); + } + RedisUtils.deleteObject(key); + return loginResultVo.getData(); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java new file mode 100644 index 0000000..8790fe1 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java @@ -0,0 +1,84 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.EmailLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 邮件认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("email" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class EmailAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String email = loginBody.getEmail(); + String emailCode = loginBody.getEmailCode(); + + // 通过邮箱查找用户 + LoginUser loginUser = remoteUserService.getUserInfoByEmail(email, tenantId); + loginService.checkLogin(LoginType.EMAIL, tenantId, loginUser.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode)); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验邮箱验证码 + */ + private boolean validateEmailCode(String tenantId, String email, String emailCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(emailCode); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java new file mode 100644 index 0000000..67d03a3 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java @@ -0,0 +1,102 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SmsLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.RemoteUserWokerService; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title MpSmsAuthStrategy + * @description 公众号短信登录 + * @create 2024-04-01 10:34 + */ + +@Service +@Slf4j +@RequiredArgsConstructor +public class MpSmsAuthStrategy implements IAuthStrategy { + + @DubboReference + private RemoteUserWokerService userWokerService; + + @Resource + private SysLoginService loginService; + + + @Override + public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + + // 通过手机号查找用户 +// LoginUser loginUser = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); +// loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> !); + validateSmsCode(tenantId, phonenumber, smsCode); + + LoginMpUser loginUser = this.userWokerService.selectUserWorkByPhonenumer(phonenumber,tenantId); + + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(MpLoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + MpLoginHelper.login(loginUser,tenantId, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + + /** + * 校验短信验证码 + */ + private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_MP_PHONE_CODE_KEY+ SmsType.MP.getIType() + phonenumber); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + } + + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java new file mode 100644 index 0000000..9550485 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java @@ -0,0 +1,104 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.PasswordLoginBody; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 密码认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("password" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class PasswordAuthStrategy implements IAuthStrategy { + + private final CaptchaProperties captchaProperties; + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + + // 验证码开关 + if (captchaProperties.getEnabled()) { + validateCaptcha(tenantId, username, code, uuid); + } + + LoginUser loginUser = remoteUserService.getUserInfo(username, tenantId); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, loginUser.getPassword())); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + private void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java new file mode 100644 index 0000000..0aff8fe --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java @@ -0,0 +1,129 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SmsLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 短信认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("sms" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SmsAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + //String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + if(ObjectUtil.isNull(loginBody.getId())){ + throw new ServiceException("登录参数缺失,请重新登录"); + } + // 通过手机号查找用户 + LoginUser loginUser = remoteUserService.getUserInfo(loginBody.getId(),tenantId); + loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> { + SmsType smsType = SmsType.getSmsTypeByRole(loginUser.getCurRoleId()); + String code = RedisUtils.getCacheObject(smsType.getCacheKey(loginUser.getPhonenumber())); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, loginUser.getUsername(), Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return !code.equals(smsCode); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setSydId(loginBody.getSydId()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + + /*public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + + // 通过手机号查找用户 + LoginUser loginUser = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); + loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + }*/ + + /** + * 校验短信验证码 + */ + /*private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + }*/ + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java new file mode 100644 index 0000000..f02ef79 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java @@ -0,0 +1,109 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SocialLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * 第三方授权策略 + * + * @author thiszhc is 三三 + */ +@Slf4j +@Service("social" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SocialAuthStrategy implements IAuthStrategy { + + private final SocialProperties socialProperties; + private final SysLoginService loginService; + + @DubboReference + private RemoteSocialService remoteSocialService; + @DubboReference + private RemoteUserService remoteUserService; + + /** + * 登录-第三方授权登录 + * + * @param body 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String body, RemoteClientVo client) { + SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); + ValidatorUtils.validate(loginBody); + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + if ("GITEE".equals(authUserData.getSource())) { + // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/flexible-employment") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + } + + List list = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (CollUtil.isEmpty(list)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + } + Optional opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny(); + if (opt.isEmpty()) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + RemoteSocialVo socialVo = opt.get(); + + LoginUser loginUser = remoteUserService.getUserInfo(socialVo.getUserId(), socialVo.getTenantId()); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..6ab8692 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java new file mode 100644 index 0000000..addcddb --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java @@ -0,0 +1,112 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.WxPubLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.time.Duration; + +/** + * 微信公众号认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("weixinpub" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class WxPubAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteWeiXinService remoteWeiXinService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + WxPubLoginBody loginBody = JsonUtils.parseObject(body, WxPubLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + if(ObjectUtil.isNull(loginBody.getId())){ + throw new ServiceException("登录参数缺失,请重新登录"); + } + String resultKey = loginService.getWxPubLoginResultCacheKey(loginBody.getId()); + R loginResultVo = RedisUtils.getCacheObject(resultKey); + if (loginResultVo == null || loginResultVo.getData() == null || StringUtils.isBlank(loginResultVo.getData().getClientId())){ + throw new ServiceException("二维码已过期,请重新登录"); + } + Long userId = Long.parseLong(loginResultVo.getData().getClientId()); + String curOpenId = remoteWeiXinService.getOpenId(Base64.decodeStr(loginBody.getDomain()),loginBody.getWxcode()); + if (StringUtils.isBlank(curOpenId)){ + loginResultVo.setMsg("授权失败,请重新登录"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + throw new ServiceException(loginResultVo.getMsg()); + } + LoginUser loginUser = remoteUserService.getUserInfo(userId,tenantId); + if(!curOpenId.equals(loginUser.getBindOpenId())){ + loginResultVo.setMsg("登录失败,绑定账户不正确"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + throw new ServiceException(loginResultVo.getMsg()); + } + SmsType smsType = SmsType.getSmsTypeByRole(loginUser.getCurRoleId()); + String code = RedisUtils.getCacheObject(smsType.getCacheKey(loginUser.getUserId().toString())); + if (StringUtils.isBlank(code) || !code.equals(loginBody.getCode())) { + loginResultVo.setMsg("二维码已过期,请重新登录"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + loginService.recordLogininfor(tenantId, loginUser.getUsername(), Constants.LOGIN_FAIL, loginResultVo.getMsg()); + throw new BaseException("user",loginResultVo.getMsg()); + } + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setSydId(loginBody.getSydId()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + long size = RedisUtils.getTimeToLive(resultKey); +// RedisUtils.setCacheObject(resultKey, R.ok(loginVo), Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + RedisUtils.setCacheObject(resultKey, R.ok(loginVo)); + return loginVo; + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java new file mode 100644 index 0000000..20ec4cc --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java @@ -0,0 +1,69 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.XcxLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.XcxLoginUser; +import org.springframework.stereotype.Service; + +/** + * 邮件认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("xcx" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class XcxAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); + ValidatorUtils.validate(loginBody); + // xcxCode 为 小程序调用 wx.login 授权后获取 + String xcxCode = loginBody.getXcxCode(); + // 多个小程序识别使用 + String appid = loginBody.getAppid(); + + // todo 以下自行实现 + // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid + String openid = ""; + XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + loginVo.setOpenid(openid); + return loginVo; + } + +} diff --git a/ruoyi-auth/src/main/resources/application.yml b/ruoyi-auth/src/main/resources/application.yml new file mode 100644 index 0000000..b00d227 --- /dev/null +++ b/ruoyi-auth/src/main/resources/application.yml @@ -0,0 +1,35 @@ +# Tomcat +server: + port: 9211 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-auth + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-auth/src/main/resources/banner.txt b/ruoyi-auth/src/main/resources/banner.txt new file mode 100644 index 0000000..97c5c27 --- /dev/null +++ b/ruoyi-auth/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) | | | | + _ __ _ _ ___ _ _ _ ______ __ _ _ _ | |_ | |__ +| '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \ +| | | |_| || (_) || |_| || | | (_| || |_| || |_ | | | | +|_| \__,_| \___/ \__, ||_| \__,_| \__,_| \__||_| |_| + __/ | + |___/ \ No newline at end of file diff --git a/ruoyi-auth/src/main/resources/logback-plus.xml b/ruoyi-auth/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-auth/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-example/pom.xml b/ruoyi-example/pom.xml new file mode 100644 index 0000000..6e27885 --- /dev/null +++ b/ruoyi-example/pom.xml @@ -0,0 +1,43 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-demo + ruoyi-stream-mq + + + ruoyi-example + pom + + + ruoyi-example 例子模块 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/README.md b/ruoyi-example/ruoyi-demo/README.md new file mode 100644 index 0000000..5ac83c8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/README.md @@ -0,0 +1,2 @@ +# 使用说明 +需要在 `ry-cloud` 数据库内执行 `test.sql` 文件 初始化测试数据 \ No newline at end of file diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml new file mode 100644 index 0000000..d717e93 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/pom.xml @@ -0,0 +1,138 @@ + + + + org.dromara + ruoyi-example + ${revision} + + 4.0.0 + + ruoyi-demo + + + ruoyi-demo 演示模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-tenant + + + + + + + + + + + + + + + org.dromara + ruoyi-common-elasticsearch + + + + org.dromara + ruoyi-common-sensitive + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java new file mode 100644 index 0000000..c62aa66 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java @@ -0,0 +1,20 @@ +package org.dromara.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 演示模块 + * + * @author Lion Li + */ +@SpringBootApplication +public class RuoYiDemoApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiDemoApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 演示模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java new file mode 100644 index 0000000..d3a1548 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java @@ -0,0 +1,89 @@ +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.Document; +import org.dromara.demo.esmapper.DocumentMapper; +import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 搜索引擎 crud 演示案例 + * + * @author Lion Li + */ +@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") +@RequiredArgsConstructor +@RestController +@RequestMapping("/es") +public class EsCrudController { + + private final DocumentMapper documentMapper; + + /** + * 查询(指定) + * + * @param title 标题 + */ + @GetMapping("/select") + public Document select(String title) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, title); + return documentMapper.selectOne(wrapper); + } + + /** + * 搜索(模糊) + * + * @param key 搜索关键字 + */ + @GetMapping("/search") + public List search(String key) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.like(Document::getTitle, key); + return documentMapper.selectList(wrapper); + } + + /** + * 插入 + */ + @PostMapping("/insert") + public Integer insert(@RequestBody Document document) { + return documentMapper.insert(document); + } + + /** + * 更新 + */ + @PutMapping("/update") + public R update(@RequestBody Document document) { + // 测试更新 更新有两种情况 分别演示如下: + // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询) + documentMapper.updateById(document); + + // case2: id未知, 根据条件更新 +// LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); +// wrapper.like(Document::getTitle, document.getTitle()); +// Document document2 = new Document(); +// document2.setTitle(document.getTitle()); +// document2.setContent(document.getContent()); +// documentMapper.update(document2, wrapper); + + return R.ok(); + } + + /** + * 删除 + * + * @param id 主键 + */ + @DeleteMapping("/delete/{id}") + public R delete(@PathVariable String id) { + // 测试删除数据 删除有两种情况:根据id删或根据条件删 + return R.ok(documentMapper.deleteById(id)); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java new file mode 100644 index 0000000..7f3e3b7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java @@ -0,0 +1,52 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.mail.utils.MailUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; + + +/** + * 邮件发送案例 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mail") +public class MailController { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + @GetMapping("/sendSimpleMessage") + public R sendSimpleMessage(String to, String subject, String text) { + MailUtils.sendText(to, subject, text); + return R.ok(); + } + + /** + * 发送邮件(带附件) + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + * @param filePath 附件路径 + */ + @GetMapping("/sendMessageWithAttachment") + public R sendMessageWithAttachment(String to, String subject, String text, String filePath) { + MailUtils.sendText(to, subject, text, new File(filePath)); + return R.ok(); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java new file mode 100644 index 0000000..9a6508a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java @@ -0,0 +1,95 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; + +/** + * spring-cache 演示案例 + * + * @author Lion Li + */ +// 类级别 缓存统一配置 +//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE) +@RequiredArgsConstructor +@RestController +@RequestMapping("/cache") +public class RedisCacheController { + + /** + * 测试 @Cacheable + *

+ * 表示这个方法有了缓存的功能,方法的返回值会被缓存下来 + * 下一次调用该方法前,会去检查是否缓存中已经有值 + * 如果有就直接返回,不调用方法 + * 如果没有,就调用方法,然后把结果缓存起来 + * 这个注解「一般用在查询方法上」 + *

+ * 重点说明: 缓存注解严禁与其他筛选数据功能一起使用 + * 例如: 数据权限注解 会造成 缓存击穿 与 数据不一致问题 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null") + @GetMapping("/test1") + public R test1(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CachePut + *

+ * 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用 + * 它「通常用在新增或者实时更新方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test2") + public R test2(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CacheEvict + *

+ * 使用了CacheEvict注解的方法,会清空指定缓存 + * 「一般用在删除的方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test3") + public R test3(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试设置过期时间 + * 手动设置过期时间10秒 + * 11秒后获取 判断是否相等 + */ + @GetMapping("/test6") + public R test6(String key, String value) { + RedisUtils.setCacheObject(key, value); + boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10)); + System.out.println("***********" + flag); + try { + Thread.sleep(11 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Object obj = RedisUtils.getCacheObject(key); + return R.ok(value.equals(obj)); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java new file mode 100644 index 0000000..1cf0542 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java @@ -0,0 +1,71 @@ +package org.dromara.demo.controller; + +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import com.baomidou.lock.annotation.Lock4j; +import com.baomidou.lock.executor.RedissonLockExecutor; +import org.dromara.common.core.domain.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalTime; + + +/** + * 测试分布式锁的样例 + * + * @author shenxinquan + */ +@Slf4j +@RestController +@RequestMapping("/redisLock") +public class RedisLockController { + + @Autowired + private LockTemplate lockTemplate; + + /** + * 测试lock4j 注解 + */ + @Lock4j(keys = {"#key"}) + @GetMapping("/testLock4j") + public R testLock4j(String key, String value) { + System.out.println("start:" + key + ",time:" + LocalTime.now()); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("end :" + key + ",time:" + LocalTime.now()); + return R.ok("操作成功", value); + } + + /** + * 测试lock4j 工具 + */ + @GetMapping("/testLock4jLockTemplate") + public R testLock4jLockTemplate(String key, String value) { + final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); + if (null == lockInfo) { + throw new RuntimeException("业务处理中,请稍后再试"); + } + // 获取锁成功,处理业务 + try { + try { + Thread.sleep(8000); + } catch (InterruptedException e) { + // + } + System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName()); + } finally { + //释放锁 + lockTemplate.releaseLock(lockInfo); + } + //结束 + return R.ok("操作成功", value); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java new file mode 100644 index 0000000..5b19610 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java @@ -0,0 +1,47 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Redis 发布订阅 演示案例 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/redis/pubsub") +public class RedisPubSubController { + + /** + * 发布消息 + * + * @param key 通道Key + * @param value 发送内容 + */ + @GetMapping("/pub") + public R pub(String key, String value) { + RedisUtils.publish(key, value, consumer -> { + System.out.println("发布通道 => " + key + ", 发送值 => " + value); + }); + return R.ok("操作成功"); + } + + /** + * 订阅消息 + * + * @param key 通道Key + */ + @GetMapping("/sub") + public R sub(String key) { + RedisUtils.subscribe(key, String.class, msg -> { + System.out.println("订阅通道 => " + key + ", 接收值 => " + msg); + }); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java new file mode 100644 index 0000000..f14fdb7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java @@ -0,0 +1,59 @@ +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.LinkedHashMap; + +/** + * 短信演示案例 + * 请先阅读文档 否则无法使用 + * + * @author Lion Li + * @version 4.2.0 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sms") +public class SmsController { + /** + * 发送短信Aliyun + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendAliyun") + public R sendAliyun(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", "1234"); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + + /** + * 发送短信Tencent + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendTencent") + public R sendTencent(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); +// map.put("2", "测试测试"); + map.put("1", "1234"); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java new file mode 100644 index 0000000..bb02f98 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java @@ -0,0 +1,31 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * swagger3 用法示例 + * + * @author Lion Li + */ +@RestController +@RequestMapping("/swagger/demo") +public class Swagger3DemoController { + + /** + * 上传请求 + * 必须使用 @RequestPart 注解标注为文件 + * + * @param file 文件 + */ + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + return R.ok("操作成功", file.getOriginalFilename()); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java new file mode 100644 index 0000000..2c49b4d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java @@ -0,0 +1,89 @@ +package org.dromara.demo.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.mapper.TestDemoMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * 测试批量方法 + * + * @author Lion Li + * @date 2021-05-30 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/batch") +public class TestBatchController extends BaseController { + + /** + * 为了便于测试 直接引入mapper + */ + private final TestDemoMapper testDemoMapper; + + /** + * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/add") +// @DS("slave") + public R add() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); + } + return toAjax(testDemoMapper.insertBatch(list)); + } + + /** + * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/addOrUpdate") +// @DS("slave") + public R addOrUpdate() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); } + testDemoMapper.insertBatch(list); + for (int i = 0; i < list.size(); i++) { + TestDemo testDemo = list.get(i); + testDemo.setTestKey("批量新增或修改"); + testDemo.setValue("批量新增或修改"); + if (i % 2 == 0) { + testDemo.setId(null); + } + } + return toAjax(testDemoMapper.insertOrUpdateBatch(list)); + } + + /** + * 删除批量方法 + */ + @DeleteMapping() +// @DS("slave") + public R remove() { + return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() + .eq(TestDemo::getOrderNum, -1L))); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java new file mode 100644 index 0000000..93b4687 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java @@ -0,0 +1,146 @@ +package org.dromara.demo.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.bo.TestDemoImportVo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 测试单表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo") +public class TestDemoController extends BaseController { + + private final ITestDemoService iTestDemoService; + + /** + * 查询测试单表列表 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/list") + public TableDataInfo list(TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.queryPageList(bo, pageQuery); + } + + /** + * 自定义分页查询 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/page") + public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.customPageList(bo, pageQuery); + } + + /** + * 导入测试-校验 + * + * @param file 导入文件 + */ + @Log(title = "测试单表", businessType = BusinessType.IMPORT) + @SaCheckPermission("demo:demo:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file) throws Exception { + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); + List volist = excelResult.getList(); + List list = BeanUtil.copyToList(volist, TestDemo.class); + iTestDemoService.saveBatch(list); + return R.ok(excelResult.getAnalysis()); + } + + /** + * 导出测试单表列表 + */ + @SaCheckPermission("demo:demo:export") + @Log(title = "测试单表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated TestDemoBo bo, HttpServletResponse response) { + List list = iTestDemoService.queryList(bo); + // 测试雪花id导出 +// for (TestDemoVo vo : list) { +// vo.setId(1234567891234567893L); +// } + ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); + } + + /** + * 获取测试单表详细信息 + * + * @param id 测试ID + */ + @SaCheckPermission("demo:demo:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { + return R.ok(iTestDemoService.queryById(id)); + } + + /** + * 新增测试单表 + */ + @SaCheckPermission("demo:demo:add") + @Log(title = "测试单表", businessType = BusinessType.INSERT) + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") + @PostMapping() + public R add(@RequestBody TestDemoBo bo) { + // 使用校验工具对标 @Validated(AddGroup.class) 注解 + // 用于在非 Controller 的地方校验对象 + ValidatorUtils.validate(bo, AddGroup.class); + return toAjax(iTestDemoService.insertByBo(bo)); + } + + /** + * 修改测试单表 + */ + @SaCheckPermission("demo:demo:edit") + @Log(title = "测试单表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(iTestDemoService.updateByBo(bo)); + } + + /** + * 删除测试单表 + * + * @param ids 测试ID串 + */ + @SaCheckPermission("demo:demo:remove") + @Log(title = "测试单表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java new file mode 100644 index 0000000..de32a43 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java @@ -0,0 +1,55 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.TestDemoEncrypt; +import org.dromara.demo.mapper.TestDemoEncryptMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 测试数据库加解密功能 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/encrypt") +public class TestEncryptController { + + @Autowired + private TestDemoEncryptMapper mapper; + @Value("${mybatis-encryptor.enable}") + private Boolean encryptEnable; + + /** + * 测试数据库加解密 + * + * @param key 测试key + * @param value 测试value + */ + @GetMapping() + public R> test(String key, String value) { + if (!encryptEnable) { + throw new RuntimeException("加密功能未开启!"); + } + Map map = new HashMap<>(2); + TestDemoEncrypt demo = new TestDemoEncrypt(); + demo.setTestKey(key); + demo.setValue(value); + mapper.insert(demo); + map.put("加密", demo); + TestDemoEncrypt testDemo = mapper.selectById(demo.getId()); + map.put("解密", testDemo); + return R.ok(map); + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java new file mode 100644 index 0000000..d82ea3b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java @@ -0,0 +1,160 @@ +package org.dromara.demo.controller; + +import cn.hutool.core.collection.CollUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.listener.ExportDemoListener; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 测试Excel功能 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/excel") +public class TestExcelController { + + private final IExportExcelService exportExcelService; + + /** + * 单列表多数据 + */ + @GetMapping("/exportTemplateOne") + public void exportTemplateOne(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title", "单列表多数据"); + map.put("test1", "数据测试1"); + map.put("test2", "数据测试2"); + map.put("test3", "数据测试3"); + map.put("test4", "数据测试4"); + map.put("testTest", "666"); + List list = new ArrayList<>(); + list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4")); + list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8")); + list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12")); + ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response); + } + + /** + * 多列表多数据 + */ + @GetMapping("/exportTemplateMuliti") + public void exportTemplateMuliti(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title1", "标题1"); + map.put("title2", "标题2"); + map.put("title3", "标题3"); + map.put("title4", "标题4"); + map.put("author", "Lion Li"); + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9")); + list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12")); + Map multiListMap = new HashMap<>(); + multiListMap.put("map", map); + multiListMap.put("data1", list1); + multiListMap.put("data2", list2); + multiListMap.put("data3", list3); + multiListMap.put("data4", list4); + ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response); + } + + /** + * 导出下拉框 + * + * @param response / + */ + @GetMapping("/exportWithOptions") + public void exportWithOptions(HttpServletResponse response) { + exportExcelService.exportWithOptions(response); + } + + /** + * 多个sheet导出 + */ + @GetMapping("/exportTemplateMultiSheet") + public void exportTemplateMultiSheet(HttpServletResponse response) { + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + list3.add(new TestObj1("list3测试4", "list3测试5", "list3测试6")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + + List> list = new ArrayList<>(); + Map sheetMap1 = new HashMap<>(); + sheetMap1.put("data1", list1); + Map sheetMap2 = new HashMap<>(); + sheetMap2.put("data2", list2); + Map sheetMap3 = new HashMap<>(); + sheetMap3.put("data3", list3); + Map sheetMap4 = new HashMap<>(); + sheetMap4.put("data4", list4); + + list.add(sheetMap1); + list.add(sheetMap2); + list.add(sheetMap3); + list.add(sheetMap4); + ExcelUtil.exportTemplateMultiSheet(list, "多sheet列表", "excel/多sheet列表.xlsx", response); + } + + /** + * 导入表格 + */ + @PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public List importWithOptions(@RequestPart("file") MultipartFile file) throws Exception { + // 处理解析结果 + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener()); + return excelResult.getList(); + } + + @Data + @AllArgsConstructor + static class TestObj1 { + private String test1; + private String test2; + private String test3; + } + + @Data + @AllArgsConstructor + static class TestObj { + private String name; + private String list1; + private String list2; + private String list3; + private String list4; + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java new file mode 100644 index 0000000..d618512 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java @@ -0,0 +1,71 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MessageUtils; +import lombok.Data; +import org.hibernate.validator.constraints.Range; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + + +/** + * 测试国际化 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/i18n") +public class TestI18nController { + + /** + * 通过code获取国际化内容 + * code为 messages.properties 中的 key + *

+ * 测试使用 user.register.success + * + * @param code 国际化code + */ + @GetMapping() + public R get(String code) { + return R.ok(MessageUtils.message(code)); + } + + /** + * Validator 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test1") + public R test1(@NotBlank(message = "{not.null}") String str) { + return R.ok(str); + } + + /** + * Bean 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test2") + public R test2(@Validated TestI18nBo bo) { + return R.ok(bo); + } + + @Data + public static class TestI18nBo { + + @NotBlank(message = "{not.null}") + private String name; + + @NotNull(message = "{not.null}") + @Range(min = 0, max = 100, message = "{length.not.valid}") + private Integer age; + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java new file mode 100644 index 0000000..1feaf1b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java @@ -0,0 +1,75 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.web.core.BaseController; +import lombok.Data; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试数据脱敏控制器 + *

+ * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + * @see org.dromara.common.sensitive.core.SensitiveService + */ +@RestController +@RequestMapping("/sensitive") +public class TestSensitiveController extends BaseController { + + /** + * 测试数据脱敏 + */ + @GetMapping("/test") + public R test() { + TestSensitive testSensitive = new TestSensitive(); + testSensitive.setIdCard("210397198608215431"); + testSensitive.setPhone("17640125371"); + testSensitive.setAddress("北京市朝阳区某某四合院1203室"); + testSensitive.setEmail("17640125371@163.com"); + testSensitive.setBankCard("6226456952351452853"); + return R.ok(testSensitive); + } + + @Data + static class TestSensitive { + + /** + * 身份证 + */ + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String idCard; + + /** + * 电话 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") + private String phone; + + /** + * 地址 + */ + @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") + private String address; + + /** + * 邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1") + private String email; + + /** + * 银行卡 + */ + @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query") + private String bankCard; + + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java new file mode 100644 index 0000000..81bb2a7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java @@ -0,0 +1,46 @@ +package org.dromara.demo.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.ShardingOrder; +import org.dromara.demo.mapper.ShardingOrderMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 使用方式 看官网文档扩展项目 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/sharding") +public class TestShardingController { + + private final ShardingOrderMapper torderMapper; + + @GetMapping("/page") + public R> page() { + Page page = new Page<>(); + page.setCurrent(3L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.orderByAsc(ShardingOrder::getOrderId); + torderMapper.selectPage(page, lqw); + return R.ok(page); + } + + @GetMapping("/insert") + public R insert() { + for (Long i = 1L; i <= 100L; i++) { + ShardingOrder torder = new ShardingOrder(); + torder.setUserId(i); + torder.setTotalMoney(100 + Integer.parseInt(i + "")); + torderMapper.insert(torder); + } + + return R.ok("分库分表数据批量插入成功!"); + + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java new file mode 100644 index 0000000..178a4b8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java @@ -0,0 +1,104 @@ +package org.dromara.demo.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 测试树表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tree") +public class TestTreeController extends BaseController { + + private final ITestTreeService iTestTreeService; + + /** + * 查询测试树表列表 + */ + @SaCheckPermission("demo:tree:list") + @GetMapping("/list") + public R> list(TestTreeBo bo) { + List list = iTestTreeService.queryList(bo); + return R.ok(list); + } + + /** + * 导出测试树表列表 + */ + @SaCheckPermission("demo:tree:export") + @Log(title = "测试树表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public void export(@Validated TestTreeBo bo, HttpServletResponse response) { + List list = iTestTreeService.queryList(bo); + ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response); + } + + /** + * 获取测试树表详细信息 + * + * @param id 测试树ID + */ + @SaCheckPermission("demo:tree:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { + return R.ok(iTestTreeService.queryById(id)); + } + + /** + * 新增测试树表 + */ + @SaCheckPermission("demo:tree:add") + @Log(title = "测试树表", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.insertByBo(bo)); + } + + /** + * 修改测试树表 + */ + @SaCheckPermission("demo:tree:edit") + @Log(title = "测试树表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.updateByBo(bo)); + } + + /** + * 删除测试树表 + * + * @param ids 测试树ID串 + */ + @SaCheckPermission("demo:tree:remove") + @Log(title = "测试树表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java new file mode 100644 index 0000000..16c30f8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.controller; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java new file mode 100644 index 0000000..71c77ee --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java @@ -0,0 +1,25 @@ +package org.dromara.demo.domain; + +import lombok.Data; + +/** + * 文档实体 + */ +@Data +public class Document { + + /** + * es中的唯一id + */ + private String id; + + /** + * 文档标题 + */ + private String title; + + /** + * 文档内容 + */ + private String content; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java new file mode 100644 index 0000000..6190e9c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java @@ -0,0 +1,16 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@TableName("t_order") +@Data +public class ShardingOrder { + + + private Long orderId; + + private Long userId; + + private int totalMoney; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java new file mode 100644 index 0000000..83fde7c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java @@ -0,0 +1,17 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@TableName("t_order_item") +@Data +public class ShardingOrderItem { + + private Long orderItemId; + + private Long orderId; + + private Long userId; + + private int totalMoney; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java new file mode 100644 index 0000000..c0f59ae --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java @@ -0,0 +1,82 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.*; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Base64; + +/** + * 测试单表对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 排序号 + */ + @OrderBy(asc = false, sort = 1) + private Integer orderNum; + + /** + * key键 + */ + private String testKey; + + /** + * 值 + */ + private String value; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + + + public static void main(String[] args) { +// byte[] bytes = Base64.decode("YVd+ZNfLLowp45JTyri0nO2SHo1ooKDU/QRc9MIsk4Ih52SN+uR2vMRNZLMJ23dKXJefCi9xm2BA37ZIkkl7614iXTwnmsNiuoMmOfH+ds="); + String encodedString = "YVd+ZNfLLowp45JTyri0nO2SHo1ooKDU/QRc9MIsk4Ih52SN++uR2vMRNZLMJ23dKXJefCi9xm2BA37ZIkkl7614iXTwnmsNiuoMmOfH+ds="; +// if (encodedString.length() % 4 != 0) { +// int padSize = 4 - (encodedString.length() % 4); +// encodedString += "="; // 添加填充字符 +// } + System.out.println(encodedString); + byte[] bytes = Base64.getDecoder().decode(encodedString); + System.out.println(bytes.length); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java new file mode 100644 index 0000000..bdcd596 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java @@ -0,0 +1,29 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemoEncrypt extends TestDemo { + + /** + * key键 + */ + // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==") + @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB") + private String testKey; + + /** + * 值 + */ + // @EncryptField // 什么也不写走默认yml配置 + // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5") + @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5") + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java new file mode 100644 index 0000000..6cd3109 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java @@ -0,0 +1,66 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 测试树表对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_tree") +public class TestTree extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 树节点名 + */ + private String treeName; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java new file mode 100644 index 0000000..2896f6c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -0,0 +1,61 @@ +package org.dromara.demo.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.demo.domain.TestDemo; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestDemo.class, reverseConvertGenerate = false) +public class TestDemoBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) + private Integer orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java new file mode 100644 index 0000000..c066118 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java @@ -0,0 +1,53 @@ +package org.dromara.demo.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +public class TestDemoImportVo { + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空") + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空") + @ExcelProperty(value = "排序号") + private Long orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空") + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空") + @ExcelProperty(value = "值") + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java new file mode 100644 index 0000000..a0a765a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java @@ -0,0 +1,54 @@ +package org.dromara.demo.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.demo.domain.TestTree; + +/** + * 测试树表业务对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestTree.class, reverseConvertGenerate = false) +public class TestTreeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 树节点名 + */ + @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) + private String treeName; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java new file mode 100644 index 0000000..cb7d83f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.domain; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java new file mode 100644 index 0000000..95fa0d1 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java @@ -0,0 +1,118 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelEnumFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.excel.convert.ExcelEnumConvert; + +/** + * 带有下拉选的Excel导出 + * + * @author Emil.Zhang + */ +@Data +@ExcelIgnoreUnannotated +@AllArgsConstructor +@NoArgsConstructor +public class ExportDemoVo { + + private static final long serialVersionUID = 1L; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名", index = 0) + @NotEmpty(message = "用户名不能为空", groups = AddGroup.class) + private String nickName; + + /** + * 用户类型 + *

+ * 使用ExcelEnumFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class) + @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info") + @NotEmpty(message = "用户类型不能为空", groups = AddGroup.class) + private String userStatus; + + /** + * 性别 + *

+ * 使用ExcelDictFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "性别", index = 2, converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + @NotEmpty(message = "性别不能为空", groups = AddGroup.class) + private String gender; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号", index = 3) + @NotEmpty(message = "手机号不能为空", groups = AddGroup.class) + private String phoneNumber; + + /** + * Email + */ + @ExcelProperty(value = "Email", index = 4) + @NotEmpty(message = "Email不能为空", groups = AddGroup.class) + private String email; + + /** + * 省 + *

+ * 级联下拉,仅判断是否选了 + */ + @ExcelProperty(value = "省", index = 5) + @NotNull(message = "省不能为空", groups = AddGroup.class) + private String province; + + /** + * 数据库中的省ID + *

+ * 处理完毕后再判断是否市正确的值 + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer provinceId; + + /** + * 市 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "市", index = 6) + @NotNull(message = "市不能为空", groups = AddGroup.class) + private String city; + + /** + * 数据库中的市ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer cityId; + + /** + * 县 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "县", index = 7) + @NotNull(message = "县不能为空", groups = AddGroup.class) + private String area; + + /** + * 数据库中的县ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer areaId; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java new file mode 100644 index 0000000..3eb072f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -0,0 +1,89 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.demo.domain.TestDemo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试单表视图对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestDemo.class) +public class TestDemoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @ExcelProperty(value = "排序号") + private Integer orderNum; + + /** + * key键 + */ + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @ExcelProperty(value = "值") + private String value; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createBy; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updateBy; + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java new file mode 100644 index 0000000..aac6033 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java @@ -0,0 +1,64 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.demo.domain.TestTree; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试树表视图对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestTree.class) +public class TestTreeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 父id + */ + @ExcelProperty(value = "父id") + private Long parentId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 树节点名 + */ + @ExcelProperty(value = "树节点名") + private String treeName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java new file mode 100644 index 0000000..c925b62 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java @@ -0,0 +1,7 @@ +package org.dromara.demo.esmapper; + +import org.dromara.demo.domain.Document; +import org.dromara.easyes.core.core.BaseEsMapper; + +public interface DocumentMapper extends BaseEsMapper { +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java new file mode 100644 index 0000000..7bd4e1e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java @@ -0,0 +1,68 @@ +package org.dromara.demo.listener; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.excel.context.AnalysisContext; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.core.DefaultExcelListener; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.demo.domain.vo.ExportDemoVo; + +import java.util.List; + +/** + * Excel带下拉框的解析处理器 + * + * @author Emil.Zhang + */ +public class ExportDemoListener extends DefaultExcelListener { + + public ExportDemoListener() { + // 显示使用构造函数,否则将导致空指针 + super(true); + } + + @Override + public void invoke(ExportDemoVo data, AnalysisContext context) { + // 先校验必填 + ValidatorUtils.validate(data, AddGroup.class); + + // 处理级联下拉的部分 + String province = data.getProvince(); + String city = data.getCity(); + String area = data.getArea(); + // 本行用户选择的省 + List thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province); + if (thisRowSelectedProvinceOption.size() == 2) { + String provinceIdStr = thisRowSelectedProvinceOption.get(1); + if (NumberUtil.isNumber(provinceIdStr)) { + // 严格要求数据的话可以在这里做与数据库相关的判断 + // 例如判断省信息是否在数据库中存在等,建议结合RedisCache做缓存10s,减少数据库调用 + data.setProvinceId(Integer.parseInt(provinceIdStr)); + } + } + // 本行用户选择的市 + List thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city); + if (thisRowSelectedCityOption.size() == 2) { + String cityIdStr = thisRowSelectedCityOption.get(1); + if (NumberUtil.isNumber(cityIdStr)) { + data.setCityId(Integer.parseInt(cityIdStr)); + } + } + // 本行用户选择的县 + List thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area); + if (thisRowSelectedAreaOption.size() == 2) { + String areaIdStr = thisRowSelectedAreaOption.get(1); + if (NumberUtil.isNumber(areaIdStr)) { + data.setAreaId(Integer.parseInt(areaIdStr)); + } + } + + // 处理完毕以后判断是否符合规则 + ValidatorUtils.validate(data, EditGroup.class); + + // 添加到处理结果中 + getExcelResult().getList().add(data); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java new file mode 100644 index 0000000..0082677 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java @@ -0,0 +1,14 @@ +package org.dromara.demo.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.demo.domain.ShardingOrderItem; + +@Mapper +@DS("sharding") +public interface ShardingOrderItemMapper extends BaseMapper { + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java new file mode 100644 index 0000000..58d3525 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java @@ -0,0 +1,15 @@ +package org.dromara.demo.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.demo.domain.ShardingOrder; + + +@Mapper +@DS("sharding") +public interface ShardingOrderMapper extends BaseMapper { + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java new file mode 100644 index 0000000..601f97a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java @@ -0,0 +1,13 @@ +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemoEncrypt; + +/** + * 测试加密功能 + * + * @author Lion Li + */ +public interface TestDemoEncryptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java new file mode 100644 index 0000000..08d2e0d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -0,0 +1,59 @@ +package org.dromara.demo.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface TestDemoMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestDemo entity); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int deleteBatchIds(@Param(Constants.COLL) Collection idList); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java new file mode 100644 index 0000000..e5f4c44 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java @@ -0,0 +1,21 @@ +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestTree; +import org.dromara.demo.domain.vo.TestTreeVo; + +/** + * 测试树表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") +}) +public interface TestTreeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java new file mode 100644 index 0000000..ff1c4df --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.mapper; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java new file mode 100644 index 0000000..4dfa5ef --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java @@ -0,0 +1,18 @@ +package org.dromara.demo.service; + +import jakarta.servlet.http.HttpServletResponse; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +public interface IExportExcelService { + + /** + * 导出下拉框 + * + * @param response / + */ + void exportWithOptions(HttpServletResponse response); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java new file mode 100644 index 0000000..bca4192 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java @@ -0,0 +1,71 @@ +package org.dromara.demo.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestDemoService { + + /** + * 查询单个 + * + * @return + */ + TestDemoVo queryById(Long id); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 查询列表 + */ + List queryList(TestDemoBo bo); + + /** + * 根据新增业务对象插入测试单表 + * + * @param bo 测试单表新增业务对象 + * @return + */ + Boolean insertByBo(TestDemoBo bo); + + /** + * 根据编辑业务对象修改测试单表 + * + * @param bo 测试单表编辑业务对象 + * @return + */ + Boolean updateByBo(TestDemoBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量保存 + */ + Boolean saveBatch(List list); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java new file mode 100644 index 0000000..9155201 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java @@ -0,0 +1,52 @@ +package org.dromara.demo.service; + +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试树表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestTreeService { + /** + * 查询单个 + * + * @return + */ + TestTreeVo queryById(Long id); + + /** + * 查询列表 + */ + List queryList(TestTreeBo bo); + + /** + * 根据新增业务对象插入测试树表 + * + * @param bo 测试树表新增业务对象 + * @return + */ + Boolean insertByBo(TestTreeBo bo); + + /** + * 根据编辑业务对象修改测试树表 + * + * @param bo 测试树表编辑业务对象 + * @return + */ + Boolean updateByBo(TestTreeBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java new file mode 100644 index 0000000..0240e02 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java @@ -0,0 +1,222 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +@Service +@RequiredArgsConstructor +public class ExportExcelServiceImpl implements IExportExcelService { + + @Override + public void exportWithOptions(HttpServletResponse response) { + // 创建表格数据,业务中一般通过数据库查询 + List excelDataList = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + // 模拟数据库中的一条数据 + ExportDemoVo everyRowData = new ExportDemoVo(); + everyRowData.setNickName("用户-" + i); + everyRowData.setUserStatus(UserStatus.OK.getCode()); + everyRowData.setGender("1"); + everyRowData.setPhoneNumber(String.format("175%08d", i)); + everyRowData.setEmail(String.format("175%08d", i) + "@163.com"); + everyRowData.setProvinceId(i); + everyRowData.setCityId(i); + everyRowData.setAreaId(i); + excelDataList.add(everyRowData); + } + + // 通过@ExcelIgnoreUnannotated配合@ExcelProperty合理显示需要的列 + // 并通过@DropDown注解指定下拉值,或者通过创建ExcelOptions来指定下拉框 + // 使用ExcelOptions时建议指定列index,防止出现下拉列解析不对齐 + + // 首先从数据库中查询下拉框内的可选项 + // 这里模拟查询结果 + List provinceList = getProvinceList(), + cityList = getCityList(provinceList), + areaList = getAreaList(cityList); + int provinceIndex = 5, cityIndex = 6, areaIndex = 7; + + DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions( + provinceList, + provinceIndex, + cityList, + cityIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions( + cityList, + cityIndex, + areaList, + areaIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + // 把所有的下拉框存储 + List options = new ArrayList<>(); + options.add(provinceToCity); + options.add(cityToArea); + + // 到此为止所有的下拉框可选项已全部配置完毕 + + // 接下来需要将Excel中的展示数据转换为对应的下拉选 + List outList = StreamUtils.toList(excelDataList, everyRowData -> { + // 只需要处理没有使用@ExcelDictFormat注解的下拉框 + // 一般来说,可以直接在数据库查询即查询出省市县信息,这里通过模拟操作赋值 + everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId())); + everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId())); + everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId())); + return everyRowData; + }); + + ExcelUtil.exportExcel(outList, "下拉框示例", ExportDemoVo.class, response, options); + } + + private String buildOptions(List cityDataList, Integer id) { + Map> groupByIdMap = + cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + if (groupByIdMap.containsKey(id)) { + DemoCityData demoCityData = groupByIdMap.get(id).get(0); + return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId()); + } else { + return StrUtil.EMPTY; + } + } + + /** + * 模拟查询数据库操作 + * + * @return / + */ + private List getProvinceList() { + List provinceList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + provinceList.add(new DemoCityData(0, null, "安徽省")); + provinceList.add(new DemoCityData(1, null, "江苏省")); + + return provinceList; + } + + /** + * 模拟查找数据库操作,需要连带查询出省的数据 + * + * @param provinceList 模拟的父省数据 + * @return / + */ + private List getCityList(List provinceList) { + List cityList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + cityList.add(new DemoCityData(0, 0, "合肥市")); + cityList.add(new DemoCityData(1, 0, "芜湖市")); + cityList.add(new DemoCityData(2, 1, "南京市")); + cityList.add(new DemoCityData(3, 1, "无锡市")); + cityList.add(new DemoCityData(4, 1, "徐州市")); + + selectParentData(provinceList, cityList); + + return cityList; + } + + /** + * 模拟查找数据库操作,需要连带查询出市的数据 + * + * @param cityList 模拟的父市数据 + * @return / + */ + private List getAreaList(List cityList) { + List areaList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + areaList.add(new DemoCityData(0, 0, "瑶海区")); + areaList.add(new DemoCityData(1, 0, "庐江区")); + areaList.add(new DemoCityData(2, 1, "南宁县")); + areaList.add(new DemoCityData(3, 1, "镜湖区")); + areaList.add(new DemoCityData(4, 2, "玄武区")); + areaList.add(new DemoCityData(5, 2, "秦淮区")); + areaList.add(new DemoCityData(6, 3, "宜兴市")); + areaList.add(new DemoCityData(7, 3, "新吴区")); + areaList.add(new DemoCityData(8, 4, "鼓楼区")); + areaList.add(new DemoCityData(9, 4, "丰县")); + + selectParentData(cityList, areaList); + + return areaList; + } + + /** + * 模拟数据库的查询父数据操作 + * + * @param parentList / + * @param sonList / + */ + private void selectParentData(List parentList, List sonList) { + Map> parentGroupByIdMap = + parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + + sonList.forEach(everySon -> { + if (parentGroupByIdMap.containsKey(everySon.getPid())) { + everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0)); + } + }); + } + + /** + * 模拟的数据库省市县 + */ + @Data + private static class DemoCityData { + /** + * 数据库id字段 + */ + private Integer id; + /** + * 数据库pid字段 + */ + private Integer pid; + /** + * 数据库name字段 + */ + private String name; + /** + * MyBatisPlus连带查询父数据 + */ + private DemoCityData pData; + + public DemoCityData(Integer id, Integer pid, String name) { + this.id = id; + this.pid = pid; + this.name = name; + } + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java new file mode 100644 index 0000000..01cc1a6 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java @@ -0,0 +1,46 @@ +package org.dromara.demo.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + */ +@Service +public class SensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotBlank(roleKey); + boolean permsExist = StringUtils.isNotBlank(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java new file mode 100644 index 0000000..afc99c7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.mapper.TestDemoMapper; +import org.dromara.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试单表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +@RequiredArgsConstructor +@Service +public class TestDemoServiceImpl implements ITestDemoService { + + private final TestDemoMapper baseMapper; + + @Override + public TestDemoVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 自定义分页查询 + */ + @Override + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(TestDemoBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } + + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestDemo::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestDemoBo bo) { + TestDemo add = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestDemoBo bo) { + TestDemo update = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestDemo entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean saveBatch(List list) { + return baseMapper.insertBatch(list); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java new file mode 100644 index 0000000..138e19b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java @@ -0,0 +1,88 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.demo.domain.TestTree; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.mapper.TestTreeMapper; +import org.dromara.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试树表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +// @DS("slave") // 切换从库查询 +@RequiredArgsConstructor +@Service +public class TestTreeServiceImpl implements ITestTreeService { + + private final TestTreeMapper baseMapper; + + @Override + public TestTreeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + // @DS("slave") // 切换从库查询 + @Override + public List queryList(TestTreeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestTree::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestTreeBo bo) { + TestTree add = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestTreeBo bo) { + TestTree update = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestTree entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java new file mode 100644 index 0000000..7011984 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.service.impl; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java new file mode 100644 index 0000000..16727ff --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.service; diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml new file mode 100644 index 0000000..00185d9 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml @@ -0,0 +1,118 @@ +# Tomcat +server: + port: 9401 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-demo + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:ruoyi-resource.yml + - optional:nacos:datasource.yml + +--- # 数据源设置 需在 system 数据源下 执行 test.sql 文件 +spring: + datasource: + dynamic: + seata: false + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${datasource.system-master.url} + username: ${datasource.system-master.username} + password: ${datasource.system-master.password} + sharding: + lazy: true + type: ${spring.datasource.type} + driver-class-name: com.mysql.cj.jdbc.Driver + # shardingproxy 服务的ip地址 + url: jdbc:mysql://127.0.0.1:3307/data-center_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true + username: root + password: root +# oracle: +# type: ${spring.datasource.type} +# driverClassName: oracle.jdbc.OracleDriver +# url: ${datasource.system-oracle.url} +# username: ${datasource.system-oracle.username} +# password: ${datasource.system-oracle.password} +# hikari: +# connectionTestQuery: SELECT 1 FROM DUAL +# postgres: +# type: ${spring.datasource.type} +# driverClassName: org.postgresql.Driver +# url: ${datasource.system-postgres.url} +# username: ${datasource.system-postgres.username} +# password: ${datasource.system-postgres.password} + +--- # elasticsearch 功能配置 +# 文档地址: https://www.easy-es.cn/ +# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取) +easy-es: + # 是否开启EE自动配置 + enable: false + # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开 + address : localhost:9200 + # 默认为http + schema: http + # 注意ES建议使用账号认证 不使用会报警告日志 + #如果无账号密码则可不配置此行 + #username: + #如果无账号密码则可不配置此行 + #password: + # 心跳策略时间 单位:ms + keep-alive-millis: 18000 + # 连接超时时间 单位:ms + connectTimeout: 5000 + # 通信超时时间 单位:ms + socketTimeout: 5000 + # 连接请求超时时间 单位:ms + connectionRequestTimeout: 5000 + # 最大连接数 单位:个 + maxConnTotal: 100 + # 最大连接路由数 单位:个 + maxConnPerRoute: 100 + global-config: + # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能 + print-dsl: true + # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快 + asyncProcessIndexBlocking: true + db-config: + # 是否开启下划线转驼峰 默认为false + map-underscore-to-camel-case: true + # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成 + id-type: customize + # 字段更新策略 默认为not_null + field-strategy: not_null + # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响. + enable-track-total-hits: true + # 数据刷新策略,默认为不刷新 + refresh-policy: immediate diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt new file mode 100644 index 0000000..1514deb --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ __| | ___ _ __ ___ ___ +| '__| | | |/ _ \| | | | |______/ _` |/ _ \ '_ ` _ \ / _ \ +| | | |_| | (_) | |_| | | | (_| | __/ | | | | | (_) | +|_| \__,_|\___/ \__, |_| \__,_|\___|_| |_| |_|\___/ + __/ | + |___/ diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx b/ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx new file mode 100644 index 0000000..0f7347d Binary files /dev/null and b/ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx differ diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx b/ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx new file mode 100644 index 0000000..5277f2e Binary files /dev/null and b/ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx differ diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/excel/多列表.xlsx b/ruoyi-example/ruoyi-demo/src/main/resources/excel/多列表.xlsx new file mode 100644 index 0000000..c7d11dc Binary files /dev/null and b/ruoyi-example/ruoyi-demo/src/main/resources/excel/多列表.xlsx differ diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..ec6586f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml new file mode 100644 index 0000000..aeed502 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml new file mode 100644 index 0000000..420912e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml new file mode 100644 index 0000000..9b722d1 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml new file mode 100644 index 0000000..f34a565 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java new file mode 100644 index 0000000..40c6ab3 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java @@ -0,0 +1,45 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 断言单元测试案例 + * + * @author Lion Li + */ +@DisplayName("断言单元测试案例") +public class AssertUnitTest { + + @DisplayName("测试 assertEquals 方法") + @Test + public void testAssertEquals() { + Assertions.assertEquals("666", new String("666")); + Assertions.assertNotEquals("666", new String("666")); + } + + @DisplayName("测试 assertSame 方法") + @Test + public void testAssertSame() { + Object obj = new Object(); + Object obj1 = obj; + Assertions.assertSame(obj, obj1); + Assertions.assertNotSame(obj, obj1); + } + + @DisplayName("测试 assertTrue 方法") + @Test + public void testAssertTrue() { + Assertions.assertTrue(true); + Assertions.assertFalse(true); + } + + @DisplayName("测试 assertNull 方法") + @Test + public void testAssertNull() { + Assertions.assertNull(null); + Assertions.assertNotNull(null); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java new file mode 100644 index 0000000..a3e96dd --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java @@ -0,0 +1,69 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.TimeUnit; + +/** + * 单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 +@DisplayName("单元测试案例") +public class DemoUnitTest { + + @Value("${spring.application.name}") + private String appName; + + @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") + @Test + public void testTest() { + System.out.println(appName); + } + + @Disabled + @DisplayName("测试 @Disabled 注解") + @Test + public void testDisabled() { + System.out.println(appName); + } + + @Timeout(value = 2L, unit = TimeUnit.SECONDS) + @DisplayName("测试 @Timeout 注解") + @Test + public void testTimeout() throws InterruptedException { + Thread.sleep(3000); + System.out.println(appName); + } + + + @DisplayName("测试 @RepeatedTest 注解") + @RepeatedTest(3) + public void testRepeatedTest() { + System.out.println(666); + } + + @BeforeAll + public static void testBeforeAll() { + System.out.println("@BeforeAll =================="); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + @AfterAll + public static void testAfterAll() { + System.out.println("@AfterAll =================="); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java new file mode 100644 index 0000000..ce56d53 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java @@ -0,0 +1,72 @@ +package org.dromara.demo; + +import org.dromara.common.core.enums.UserType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * 带参数单元测试案例 + * + * @author Lion Li + */ +@DisplayName("带参数单元测试案例") +public class ParamUnitTest { + + @DisplayName("测试 @ValueSource 注解") + @ParameterizedTest + @ValueSource(strings = {"t1", "t2", "t3"}) + public void testValueSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @NullSource 注解") + @ParameterizedTest + @NullSource + public void testNullSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @EnumSource 注解") + @ParameterizedTest + @EnumSource(UserType.class) + public void testEnumSource(UserType type) { + System.out.println(type.getUserType()); + } + + @DisplayName("测试 @MethodSource 注解") + @ParameterizedTest + @MethodSource("getParam") + public void testMethodSource(String str) { + System.out.println(str); + } + + public static Stream getParam() { + List list = new ArrayList<>(); + list.add("t1"); + list.add("t2"); + list.add("t3"); + return list.stream(); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java new file mode 100644 index 0000000..300057d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java @@ -0,0 +1,49 @@ +package org.dromara.demo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import org.dromara.demo.domain.ShardingOrder; +import org.dromara.demo.mapper.ShardingOrderMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TOrderTest { + + @Autowired + ShardingOrderMapper torderMapper; + + + @Test + void find() { + //Order order = orderMapper.selectById(1640990702722723841L); + } + + @Test + void page() { + Page page = new Page<>(); + page.setCurrent(3L); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByAsc("order_id"); + torderMapper.selectPage(page,queryWrapper); + System.out.println(page.getTotal()); + for(ShardingOrder order : page.getRecords()){ + System.out.print(order.getTotalMoney()+" "); + } + } + + @Test + void insert() { + for(Long i = 1L; i <= 100L; i++){ + ShardingOrder torder = new ShardingOrder(); + torder.setUserId(i); + torder.setTotalMoney(100 + Integer.parseInt(i+"")); + torderMapper.insert(torder); + } + + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java new file mode 100644 index 0000000..6d8c416 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java @@ -0,0 +1,54 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.*; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * 标签单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest +@DisplayName("标签单元测试案例") +public class TagUnitTest { + + @Tag("dev") + @DisplayName("测试 @Tag dev") + @Test + public void testTagDev() { + System.out.println("dev"); + } + + @Tag("prod") + @DisplayName("测试 @Tag prod") + @Test + public void testTagProd() { + System.out.println("prod"); + } + + @Tag("local") + @DisplayName("测试 @Tag local") + @Test + public void testTagLocal() { + System.out.println("local"); + } + + @Tag("exclude") + @DisplayName("测试 @Tag exclude") + @Test + public void testTagExclude() { + System.out.println("exclude"); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-example/ruoyi-stream-mq/pom.xml b/ruoyi-example/ruoyi-stream-mq/pom.xml new file mode 100644 index 0000000..5b3343e --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/pom.xml @@ -0,0 +1,98 @@ + + + + org.dromara + ruoyi-example + ${revision} + + 4.0.0 + + ruoyi-stream-mq + + + ruoyi-stream-mq SpringCloud-Stream-MQ 案例项目 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + com.alibaba.cloud + spring-cloud-starter-stream-rocketmq + + + + org.springframework.cloud + spring-cloud-starter-stream-kafka + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java new file mode 100644 index 0000000..2c46467 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java @@ -0,0 +1,22 @@ +package org.dromara.stream; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * SpringCloud-Stream-MQ 案例项目 + * + * @author Lion Li + */ +@SpringBootApplication +public class RuoYiStreamMqApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiStreamMqApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ MQ案例模块启动成功 ლ(´ڡ`ლ)゙ "); + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java new file mode 100644 index 0000000..bbfee28 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java @@ -0,0 +1,60 @@ +package org.dromara.stream.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.stream.mq.producer.DelayProducer; +import org.dromara.stream.mq.producer.LogStreamProducer; +import org.dromara.stream.mq.producer.TestStreamProducer; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试mq + */ +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/test-mq") +public class TestMqController { + + private final DelayProducer delayProducer; + private final TestStreamProducer testStreamProducer; + private final LogStreamProducer logStreamProducer; + + /** + * 发送消息Rabbitmq + * + * @param msg 消息内容 + * @param delay 延时时间 + */ + @GetMapping("/sendRabbitmq") + public R sendRabbitmq(String msg, Long delay) { + delayProducer.sendMsg(msg, delay); + return R.ok(); + } + + /** + * 发送消息Rocketmq + * + * @param msg 消息内容 + */ + @GetMapping("/sendRocketmq") + public R sendRocketmq(String msg) { + testStreamProducer.streamTestMsg(msg); + return R.ok(); + } + + /** + * 发送消息Kafka + * + * @param msg 消息内容 + */ + @GetMapping("/sendKafka") + public R sendKafka(String msg) { + logStreamProducer.streamLogMsg(msg); + return R.ok(); + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java new file mode 100644 index 0000000..9759bee --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java @@ -0,0 +1,20 @@ +package org.dromara.stream.mq; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author Lion Li + */ +@Data +@Accessors(chain = true) +public class TestMessaging { + /** + * 消息id + */ + private String msgId; + /** + * 消息内容 + */ + private String msgText; +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java new file mode 100644 index 0000000..6045286 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java @@ -0,0 +1,22 @@ +package org.dromara.stream.mq.consumer; + + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class DelayConsumer { + + @Bean + Consumer delay() { + log.info("初始化订阅"); + return obj -> { + log.info("消息接收成功:" + obj); + }; + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java new file mode 100644 index 0000000..b6fed99 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java @@ -0,0 +1,23 @@ +package org.dromara.stream.mq.consumer; + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class LogStreamConsumer { + + @Bean + Consumer log() { + log.info("初始化订阅log"); + return msg -> { + System.out.println(msg.toString()); + log.info("通过stream消费到消息 => {}", msg.toString()); + }; + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java new file mode 100644 index 0000000..b881c01 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java @@ -0,0 +1,23 @@ +package org.dromara.stream.mq.consumer; + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class TestStreamConsumer { + + @Bean + Consumer demo() { + log.info("初始化订阅rocketmq"); + return msg -> { + System.out.println("================="); + log.info("通过stream消费到消息 => {}", msg.toString()); + }; + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java new file mode 100644 index 0000000..b879d91 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java @@ -0,0 +1,27 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class DelayProducer { + + @Autowired + private StreamBridge streamBridge; + + public void sendMsg(String msg, Long delay) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId(UUID.randomUUID().toString()) + .setMsgText(msg); + Message message = MessageBuilder.withPayload(testMessaging) + .setHeader("x-delay", delay).build(); + streamBridge.send("delay-out-0", message); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java new file mode 100644 index 0000000..bff3924 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java @@ -0,0 +1,24 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class LogStreamProducer { + + @Autowired + private StreamBridge streamBridge; + + public void streamLogMsg(String msg) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId(UUID.randomUUID().toString()) + .setMsgText(msg); + streamBridge.send("log-out-0", MessageBuilder.withPayload(testMessaging).build()); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java new file mode 100644 index 0000000..839ae49 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java @@ -0,0 +1,26 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class TestStreamProducer { + + @Autowired + private StreamBridge streamBridge; + + public void streamTestMsg(String msg) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId( UUID.randomUUID().toString()) + .setMsgText(msg); + + System.out.println(testMessaging); + streamBridge.send("demo-out-0", MessageBuilder.withPayload(testMessaging).build()); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml new file mode 100644 index 0000000..41e7d3a --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml @@ -0,0 +1,112 @@ +server: + port: 9402 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-stream-mq + profiles: + # 环境配置 + active: @profiles.active@ + cloud: + function: + # 重点配置 与 binding 名与消费者对应 + definition: delay;demo;log + +--- # rabbitmq 配置 +spring: + rabbitmq: + host: localhost + port: 5672 + username: root + password: root + cloud: + stream: + rabbit: + bindings: + delay-in-0: + consumer: + delayedExchange: true + delay-out-0: + producer: + delayedExchange: true + bindings: + delay-in-0: + destination: delay.exchange.cloud + content-type: application/json + group: delay-group + binder: rabbit + delay-out-0: + destination: delay.exchange.cloud + content-type: application/json + group: delay-group + binder: rabbit + +--- # rocketmq 配置 +spring: + cloud: + stream: + rocketmq: + binder: + # rocketmq 地址 + name-server: 192.168.32.213:9876 + bindings: + demo-out-0: + producer: + # 必须得写 + group: default + bindings: + demo-out-0: + content-type: application/json + destination: stream-test-topic + group: test-group + binder: rocketmq + + demo-in-0: + content-type: application/json + destination: stream-test-topic + group: test-group + binder: rocketmq + + +--- # kafka 配置 +spring: + cloud: + stream: + kafka: + binder: + brokers: localhost:9092 + bindings: + log-out-0: + destination: stream-log-topic + contentType: application/json + group: log_group + binder: kafka + log-in-0: + destination: stream-log-topic + contentType: application/json + group: log_group + binder: kafka + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt new file mode 100644 index 0000000..8a8054c --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___| |_ _ __ ___ __ _ _ __ ___ ______ _ __ ___ __ _ +| '__| | | |/ _ \| | | | |______/ __| __| '__/ _ \/ _` | '_ ` _ \______| '_ ` _ \ / _` | +| | | |_| | (_) | |_| | | \__ \ |_| | | __/ (_| | | | | | | | | | | | | (_| | +|_| \__,_|\___/ \__, |_| |___/\__|_| \___|\__,_|_| |_| |_| |_| |_| |_|\__, | + __/ | | | + |___/ |_| diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..0507560 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + diff --git a/ruoyi-gateway/Dockerfile b/ruoyi-gateway/Dockerfile new file mode 100644 index 0000000..35bf497 --- /dev/null +++ b/ruoyi-gateway/Dockerfile @@ -0,0 +1,22 @@ + #FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/gateway/logs \ + /ruoyi/gateway/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/gateway + +ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-gateway.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-gateway \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml new file mode 100644 index 0000000..95945bd --- /dev/null +++ b/ruoyi-gateway/pom.xml @@ -0,0 +1,154 @@ + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + ruoyi-gateway + + + ruoyi-gateway网关模块 + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.github.ben-manes.caffeine + caffeine + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.cloud + spring-cloud-loadbalancer + + + + cn.hutool + hutool-http + + + + + cn.dev33 + sa-token-reactor-spring-boot3-starter + ${satoken.version} + + + + org.dromara + ruoyi-common-sentinel + + + com.alibaba.csp + sentinel-apache-dubbo3-adapter + + + + + + org.dromara + ruoyi-common-satoken + + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + + org.dromara + ruoyi-common-loadbalancer + + + + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java new file mode 100644 index 0000000..877d6f5 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java @@ -0,0 +1,25 @@ +package org.dromara.gateway; + +import cn.hutool.crypto.SecureUtil; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 网关启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiGatewayApplication { + public static void main(String[] args) { + // 标记 sentinel 类型为 网关 + System.setProperty("csp.sentinel.app.type", "1"); + SpringApplication application = new SpringApplication(RuoYiGatewayApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 网关启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java new file mode 100644 index 0000000..d3b40dd --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java @@ -0,0 +1,21 @@ +package org.dromara.gateway.config; + +import org.dromara.gateway.handler.SentinelFallbackHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; + +/** + * 网关限流配置 + * + * @author ruoyi + */ +@Configuration +public class GatewayConfig { + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelFallbackHandler sentinelGatewayExceptionHandler() { + return new SentinelFallbackHandler(); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java new file mode 100644 index 0000000..c038bd4 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java @@ -0,0 +1,28 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +/** + * api解密属性配置类 + * @author wdhcr + */ +@Data +@Component +@RefreshScope +@ConfigurationProperties(prefix = "api-decrypt") +public class ApiDecryptProperties { + + /** + * 加密开关 + */ + private Boolean enabled; + + /** + * 头部标识 + */ + private String headerFlag; + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java new file mode 100644 index 0000000..5996030 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java @@ -0,0 +1,24 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 自定义gateway参数配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "spring.cloud.gateway") +public class CustomGatewayProperties { + + /** + * 请求日志 + */ + private Boolean requestLog; + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java new file mode 100644 index 0000000..bf27ed6 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java @@ -0,0 +1,29 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * 放行白名单配置 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.ignore") +public class IgnoreWhiteProperties { + /** + * 放行白名单配置,网关不校验此处的白名单 + */ + private List whites = new ArrayList<>(); + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java new file mode 100644 index 0000000..d75b024 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java @@ -0,0 +1,31 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * XSS跨站脚本配置 + * + * @author ruoyi + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.xss") +public class XssProperties { + /** + * Xss开关 + */ + private Boolean enabled; + + /** + * 排除路径 + */ + private List excludeUrls = new ArrayList<>(); + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java new file mode 100644 index 0000000..88c61d2 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java @@ -0,0 +1,69 @@ +package org.dromara.gateway.filter; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.reactor.context.SaReactorSyncHolder; +import cn.dev33.satoken.reactor.filter.SaReactorFilter; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.gateway.config.properties.IgnoreWhiteProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.server.reactive.ServerHttpRequest; + +/** + * [Sa-Token 权限认证] 拦截器 + * + * @author Lion Li + */ +@Configuration +public class AuthFilter { + + /** + * 注册 Sa-Token 全局过滤器 + */ + @Bean + public SaReactorFilter getSaReactorFilter(IgnoreWhiteProperties ignoreWhite) { + return new SaReactorFilter() + // 拦截地址 + .addInclude("/**") + .addExclude("/favicon.ico", "/actuator/**") + // 鉴权方法:每次访问进入 + .setAuth(obj -> { + // 登录校验 -- 拦截所有路由 + SaRouter.match("/**") + .notMatch(ignoreWhite.getWhites()) + .check(r -> { + // 检查是否登录 是否有token + StpUtil.checkLogin(); + + // 检查 header 与 param 里的 clientid 与 token 里的是否一致 + ServerHttpRequest request = SaReactorSyncHolder.getContext().getRequest(); + String headerCid = request.getHeaders().getFirst(LoginHelper.CLIENT_KEY); + String paramCid = request.getQueryParams().getFirst(LoginHelper.CLIENT_KEY); + String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); + if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { + // token 无效 + throw NotLoginException.newInstance(StpUtil.getLoginType(), + "-100", "客户端ID与Token不匹配", + StpUtil.getTokenValue()); + } + + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } + }); + }).setError(e -> { + e.printStackTrace(); + if (e instanceof NotLoginException) { + return SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED); + } + return SaResult.error("认证失败,无法访问系统资源").setCode(HttpStatus.UNAUTHORIZED); + }); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java new file mode 100644 index 0000000..177e93c --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java @@ -0,0 +1,58 @@ +package org.dromara.gateway.filter; + +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * 黑名单过滤器 + * + * @author ruoyi + */ +@Component +public class BlackListUrlFilter extends AbstractGatewayFilterFactory { + @Override + public GatewayFilter apply(Config config) { + return (exchange, chain) -> { + + String url = exchange.getRequest().getURI().getPath(); + if (config.matchBlacklist(url)) { + return WebFluxUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问"); + } + + return chain.filter(exchange); + }; + } + + public BlackListUrlFilter() { + super(Config.class); + } + + public static class Config { + private List blacklistUrl; + + private List blacklistUrlPattern = new ArrayList<>(); + + public boolean matchBlacklist(String url) { + return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find()); + } + + public List getBlacklistUrl() { + return blacklistUrl; + } + + public void setBlacklistUrl(List blacklistUrl) { + this.blacklistUrl = blacklistUrl; + this.blacklistUrlPattern.clear(); + this.blacklistUrl.forEach(url -> { + this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE)); + }); + } + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java new file mode 100644 index 0000000..fe0348b --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java @@ -0,0 +1,41 @@ +package org.dromara.gateway.filter; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.same.SaSameUtil; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 转发认证过滤器(内部服务外网隔离) + * + * @author Lion Li + */ +@Component +public class ForwardAuthFilter implements GlobalFilter, Ordered { + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // 未开启配置则直接跳过 + if (!SaManager.getConfig().getCheckSameToken()) { + return chain.filter(exchange); + } + ServerHttpRequest newRequest = exchange + .getRequest() + .mutate() + // 为请求追加 Same-Token 参数 + .header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken()) + .build(); + ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); + return chain.filter(newExchange); + } + + @Override + public int getOrder() { + return -100; + } +} + diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java new file mode 100644 index 0000000..09e50ff --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java @@ -0,0 +1,38 @@ +package org.dromara.gateway.filter; + +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 全局缓存获取body请求数据(解决流不能重复读取问题) + * + * @author Lion Li + */ +@Component +public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // 只缓存json类型请求 + if (!WebFluxUtils.isJsonRequest(exchange)) { + return chain.filter(exchange); + } + return ServerWebExchangeUtils.cacheRequestBody(exchange, (serverHttpRequest) -> { + if (serverHttpRequest == exchange.getRequest()) { + return chain.filter(exchange); + } + return chain.filter(exchange.mutate().request(serverHttpRequest).build()); + }); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 1; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java new file mode 100644 index 0000000..e383565 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java @@ -0,0 +1,58 @@ +package org.dromara.gateway.filter; + +import org.springframework.core.Ordered; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.cors.reactive.CorsUtils; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + + +/** + * 跨域配置 + * + * @author Lion Li + */ +@Component +public class GlobalCorsFilter implements WebFilter, Ordered { + + /** + * 这里为支持的请求头,如果有自定义的header字段请自己添加 + */ + private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Language, Content-Type, Authorization, clientid, credential, X-XSRF-TOKEN, isToken, token, Admin-Token, App-Token, isEncrypt, encrypt-key"; + private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD"; + private static final String ALLOWED_ORIGIN = "*"; + private static final String ALLOWED_EXPOSE = "*"; + private static final String MAX_AGE = "18000L"; + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + if (CorsUtils.isCorsRequest(request)) { + ServerHttpResponse response = exchange.getResponse(); + HttpHeaders headers = response.getHeaders(); + headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS); + headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); + headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); + headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE); + headers.add("Access-Control-Max-Age", MAX_AGE); + headers.add("Access-Control-Allow-Credentials", "true"); + if (request.getMethod() == HttpMethod.OPTIONS) { + response.setStatusCode(HttpStatus.OK); + return Mono.empty(); + } + } + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java new file mode 100644 index 0000000..bad65bf --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java @@ -0,0 +1,41 @@ +package org.dromara.gateway.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.i18n.SimpleLocaleContext; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.Locale; + +/** + * 全局国际化处理 + * + * @author Lion Li + */ +@Slf4j +@Component +public class GlobalI18nFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String language = exchange.getRequest().getHeaders().getFirst("content-language"); + Locale locale = Locale.getDefault(); + if (language != null && language.length() > 0) { + String[] split = language.split("_"); + locale = new Locale(split[0], split[1]); + } + LocaleContextHolder.setLocaleContext(new SimpleLocaleContext(locale), true); + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java new file mode 100644 index 0000000..2c77651 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java @@ -0,0 +1,81 @@ +package org.dromara.gateway.filter; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.gateway.config.properties.ApiDecryptProperties; +import org.dromara.gateway.config.properties.CustomGatewayProperties; +import org.dromara.gateway.utils.WebFluxUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.MultiValueMap; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 全局日志过滤器 + *

+ * 用于打印请求执行参数与响应时间等等 + * + * @author Lion Li + */ +@Slf4j +@Component +public class GlobalLogFilter implements GlobalFilter, Ordered { + + @Autowired + private CustomGatewayProperties customGatewayProperties; + @Autowired + private ApiDecryptProperties apiDecryptProperties; + + private static final String START_TIME = "startTime"; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + if (!customGatewayProperties.getRequestLog()) { + return chain.filter(exchange); + } + ServerHttpRequest request = exchange.getRequest(); + String path = WebFluxUtils.getOriginalRequestUrl(exchange); + String url = request.getMethod().name() + " " + path; + + // 打印请求参数 + if (WebFluxUtils.isJsonRequest(exchange)) { + if (apiDecryptProperties.getEnabled() + && ObjectUtil.isNotNull(request.getHeaders().getFirst(apiDecryptProperties.getHeaderFlag()))) { + log.info("[PLUS]开始请求 => URL[{}],参数类型[encrypt]", url); + } else { + String jsonParam = WebFluxUtils.resolveBodyFromCacheRequest(exchange); + log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + } + } else { + MultiValueMap parameterMap = request.getQueryParams(); + if (MapUtil.isNotEmpty(parameterMap)) { + String parameters = JsonUtils.toJsonString(parameterMap); + log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); + } else { + log.info("[PLUS]开始请求 => URL[{}],无参数", url); + } + } + + exchange.getAttributes().put(START_TIME, System.currentTimeMillis()); + return chain.filter(exchange).then(Mono.fromRunnable(() -> { + Long startTime = exchange.getAttribute(START_TIME); + if (startTime != null) { + long executeTime = (System.currentTimeMillis() - startTime); + log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", url, executeTime); + } + })); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java new file mode 100644 index 0000000..d501610 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java @@ -0,0 +1,100 @@ +package org.dromara.gateway.filter; + +import cn.hutool.http.HtmlUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.gateway.config.properties.XssProperties; +import org.dromara.gateway.utils.WebFluxUtils; +import io.netty.buffer.ByteBufAllocator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; + +/** + * 跨站脚本过滤器 + * + * @author ruoyi + */ +@Component +@ConditionalOnProperty(value = "security.xss.enabled", havingValue = "true") +public class XssFilter implements GlobalFilter, Ordered { + // 跨站脚本的 xss 配置,nacos自行添加 + @Autowired + private XssProperties xss; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + // GET DELETE 不过滤 + HttpMethod method = request.getMethod(); + if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { + return chain.filter(exchange); + } + // 非json类型,不过滤 + if (!WebFluxUtils.isJsonRequest(exchange)) { + return chain.filter(exchange); + } + // excludeUrls 不过滤 + String url = request.getURI().getPath(); + if (StringUtils.matches(url, xss.getExcludeUrls())) { + return chain.filter(exchange); + } + ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); + return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); + + } + + private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { + ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public Flux getBody() { + Flux body = super.getBody(); + return body.buffer().map(dataBuffers -> { + DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); + DataBuffer join = dataBufferFactory.join(dataBuffers); + byte[] content = new byte[join.readableByteCount()]; + join.read(content); + DataBufferUtils.release(join); + String bodyStr = new String(content, StandardCharsets.UTF_8); + // 防xss攻击过滤 + bodyStr = HtmlUtil.cleanHtmlTag(bodyStr); + // 转成字节 + byte[] bytes = bodyStr.getBytes(); + NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); + DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); + buffer.write(bytes); + return buffer; + }); + } + + @Override + public HttpHeaders getHeaders() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length + httpHeaders.remove(HttpHeaders.CONTENT_LENGTH); + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + return httpHeaders; + } + + }; + return serverHttpRequestDecorator; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java new file mode 100644 index 0000000..e89538e --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java @@ -0,0 +1,46 @@ +package org.dromara.gateway.handler; + +import org.dromara.gateway.utils.WebFluxUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 网关统一异常处理 + * + * @author ruoyi + */ +@Slf4j +@Order(-1) +@Configuration +public class GatewayExceptionHandler implements ErrorWebExceptionHandler { + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + ServerHttpResponse response = exchange.getResponse(); + + if (exchange.getResponse().isCommitted()) { + return Mono.error(ex); + } + + String msg; + + if (ex instanceof NotFoundException) { + msg = "服务未找到"; + } else if (ex instanceof ResponseStatusException responseStatusException) { + msg = responseStatusException.getMessage(); + } else { + msg = "内部服务器错误"; + } + + log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage()); + + return WebFluxUtils.webFluxResponseWriter(response, msg); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java new file mode 100644 index 0000000..0aec088 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java @@ -0,0 +1,36 @@ +package org.dromara.gateway.handler; + +import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * 自定义限流异常处理 + * + * @author ruoyi + */ +public class SentinelFallbackHandler implements WebExceptionHandler { + private Mono writeResponse(ServerResponse response, ServerWebExchange exchange) { + return WebFluxUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试"); + } + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + ex.printStackTrace(); + if (exchange.getResponse().isCommitted()) { + return Mono.error(ex); + } + if (!BlockException.isBlockException(ex)) { + return Mono.error(ex); + } + return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange)); + } + + private Mono handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) { + return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java new file mode 100644 index 0000000..278050a --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java @@ -0,0 +1,150 @@ +package org.dromara.gateway.utils; + +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.gateway.filter.GlobalCacheRequestFilter; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashSet; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; + +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; + +/** + * WebFlux 工具类 + * + * @author Lion Li + */ +public class WebFluxUtils { + + /** + * 获取原请求路径 + */ + public static String getOriginalRequestUrl(ServerWebExchange exchange) { + ServerHttpRequest request = exchange.getRequest(); + LinkedHashSet uris = exchange.getAttributeOrDefault(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, new LinkedHashSet<>()); + URI requestUri = uris.stream().findFirst().orElse(request.getURI()); + return UriComponentsBuilder.fromPath(requestUri.getRawPath()).build().toUriString(); + } + + /** + * 是否是Json请求 + * + * @param exchange HTTP请求 + */ + public static boolean isJsonRequest(ServerWebExchange exchange) { + String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } + + /** + * 读取request内的body + * + * 注意一个request只能读取一次 读取之后需要重新包装 + */ + public static String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { + // 获取请求体 + Flux body = serverHttpRequest.getBody(); + AtomicReference bodyRef = new AtomicReference<>(); + body.subscribe(buffer -> { + try (DataBuffer.ByteBufferIterator iterator = buffer.readableByteBuffers()) { + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(iterator.next()); + DataBufferUtils.release(buffer); + bodyRef.set(charBuffer.toString()); + } + }); + return bodyRef.get(); + } + + /** + * 从缓存中读取request内的body + * + * 注意要求经过 {@link ServerWebExchangeUtils#cacheRequestBody(ServerWebExchange, Function)} 此方法创建缓存 + * 框架内已经使用 {@link GlobalCacheRequestFilter} 全局创建了body缓存 + * + * @return body + */ + public static String resolveBodyFromCacheRequest(ServerWebExchange exchange) { + Object obj = exchange.getAttributes().get(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR); + if (ObjectUtil.isNull(obj)) { + return null; + } + DataBuffer buffer = (DataBuffer) obj; + try (DataBuffer.ByteBufferIterator iterator = buffer.readableByteBuffers()) { + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(iterator.next()); + return charBuffer.toString(); + } + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, Object value) { + return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, Object value, int code) { + return webFluxResponseWriter(response, HttpStatus.OK, value, code); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param status http状态码 + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code) { + return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param contentType content-type + * @param status http状态码 + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) { + response.setStatusCode(status); + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); + R result = R.fail(code, value.toString()); + DataBuffer dataBuffer = response.bufferFactory().wrap(JsonUtils.toJsonString(result).getBytes()); + return response.writeWith(Mono.just(dataBuffer)); + } +} diff --git a/ruoyi-gateway/src/main/resources/application.yml b/ruoyi-gateway/src/main/resources/application.yml new file mode 100644 index 0000000..3e2def6 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Tomcat +server: + port: 8081 + servlet: + context-path: / + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-gateway + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-gateway/src/main/resources/banner.txt b/ruoyi-gateway/src/main/resources/banner.txt new file mode 100644 index 0000000..ceced29 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ __ _ __ _ | |_ ___ __ __ __ _ _ _ +| '__|| | | | / _ \ | | | || ||______| / _` | / _` || __| / _ \\ \ /\ / / / _` || | | | +| | | |_| || (_) || |_| || | | (_| || (_| || |_ | __/ \ V V / | (_| || |_| | +|_| \__,_| \___/ \__, ||_| \__, | \__,_| \__| \___| \_/\_/ \__,_| \__, | + __/ | __/ | __/ | + |___/ |___/ |___/ \ No newline at end of file diff --git a/ruoyi-gateway/src/main/resources/logback-plus.xml b/ruoyi-gateway/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..4d66014 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/logback-plus.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/console.log + + + ${log.path}/console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml new file mode 100644 index 0000000..e482762 --- /dev/null +++ b/ruoyi-modules/pom.xml @@ -0,0 +1,56 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-system + ruoyi-gen + ruoyi-job + ruoyi-resource + ruoyi-payment + ruoyi-settlement + ruoyi-mp + ruoyi-flexible + + + ruoyi-modules + pom + + + ruoyi-modules业务模块 + + + + + + org.dromara + ruoyi-common-loadbalancer + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/pom.xml b/ruoyi-modules/ruoyi-flexible/pom.xml new file mode 100644 index 0000000..5d089bd --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/pom.xml @@ -0,0 +1,149 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-flexible + + + ruoyi-flexible灵活用工业务 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java new file mode 100644 index 0000000..7976e91 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java @@ -0,0 +1,29 @@ +package org.dromara.flexible; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * @author sunzexing + * @version 1.0 + * @title RuoYiMpApplication + * @description + * @create 2024-03-28 14:27 + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiFlexibleApplication { + + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiFlexibleApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 灵工业务模块启动成功 ლ(´ڡ`ლ)゙ "); + + } + +} diff --git a/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java new file mode 100644 index 0000000..c1bd728 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java @@ -0,0 +1,20 @@ +package org.dromara.flexible.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title FlexibleException + * @description 灵活用工自定义异常类 + * @create 2024-04-13 17:30 + */ +public class FlexibleException extends BaseException { + + + public FlexibleException(String msg){ + super(msg); + } + + +} diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml b/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml new file mode 100644 index 0000000..fd66dbb --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9224 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-flexible + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt new file mode 100644 index 0000000..d4f7e6e --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt @@ -0,0 +1,18 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + # # # # + ############# ## ### ############ # + # # ##### # # # ############# + ########### # # # # # + # # # # # # # + ############ ## # # ########### # + # # # ########### # # # # + # # # # # # # + # # # # # # # # # # + ## # ## # ######## ########### # + # # # # ### # # # # # # + # # # # # # # # # + # # # # # # # # # # + # ## # # # # # # ############### + ## ### # ####### # # # # +## # # # # # # diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-gen/Dockerfile b/ruoyi-modules/ruoyi-gen/Dockerfile new file mode 100644 index 0000000..5b1f972 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/Dockerfile @@ -0,0 +1,16 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/gen/logs + +WORKDIR /ruoyi/gen + +ENV SERVER_PORT=9202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-gen.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} -jar app.jar ${JAVA_OPTS} diff --git a/ruoyi-modules/ruoyi-gen/pom.xml b/ruoyi-modules/ruoyi-gen/pom.xml new file mode 100644 index 0000000..f1b388b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/pom.xml @@ -0,0 +1,94 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-gen + + + ruoyi-gen代码生成 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.apache.velocity + velocity-engine-core + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java new file mode 100644 index 0000000..d2350df --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java @@ -0,0 +1,22 @@ +package org.dromara.gen; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 代码生成 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiGenApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiGenApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 代码生成模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java new file mode 100644 index 0000000..e973e32 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java @@ -0,0 +1,65 @@ +package org.dromara.gen.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +public class GenConfig { + /** + * 作者 + */ + public static String author; + + /** + * 生成包路径 + */ + public static String packageName; + + /** + * 自动去除表前缀,默认是false + */ + public static boolean autoRemovePre; + + /** + * 表前缀(类名不会包含表前缀) + */ + public static String tablePrefix; + + public static String getAuthor() { + return author; + } + + public void setAuthor(String author) { + GenConfig.author = author; + } + + public static String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() { + return autoRemovePre; + } + + public void setAutoRemovePre(boolean autoRemovePre) { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() { + return tablePrefix; + } + + public void setTablePrefix(String tablePrefix) { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java new file mode 100644 index 0000000..937869f --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java @@ -0,0 +1,186 @@ +package org.dromara.gen.constant; + +/** + * 代码生成通用常量 + * + * @author Lion Li + */ +public interface GenConstants { + /** + * 单表(增删改查) + */ + String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + String TPL_TREE = "tree"; + + /** + * 树编码字段 + */ + String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; + + /** + * 数据库文本类型 + */ + String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", + "ntext", "image", "bytea"}; + + /** + * 数据库时间类型 + */ + String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", + "smalldatetime", "datetime2", "datetimeoffset"}; + + /** + * 数据库数字类型 + */ + String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal", "numeric", "real", "double precision", + "smallserial", "serial", "bigserial", "money", "smallmoney"}; + + /** + * BO对象 不需要添加字段 + */ + String[] COLUMNNAME_NOT_ADD = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要编辑字段 + */ + String[] COLUMNNAME_NOT_EDIT = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * VO对象 不需要返回字段 + */ + String[] COLUMNNAME_NOT_LIST = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要查询字段 + */ + String[] COLUMNNAME_NOT_QUERY = {"id", "create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark", "version", "tenant_id"}; + + /** + * Entity基类字段 + */ + String[] BASE_ENTITY = {"createDept", "createBy", "createTime", "updateBy", "updateTime", "tenantId"}; + + /** + * 文本框 + */ + String HTML_INPUT = "input"; + + /** + * 文本域 + */ + String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + String HTML_SELECT = "select"; + + /** + * 单选框 + */ + String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + String TYPE_STRING = "String"; + + /** + * 整型 + */ + String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + String QUERY_LIKE = "LIKE"; + + /** + * 相等查询 + */ + String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + String REQUIRE = "1"; +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java new file mode 100644 index 0000000..bd278b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java @@ -0,0 +1,217 @@ +package org.dromara.gen.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; +import org.dromara.gen.service.IGenTableService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/gen") +public class GenController extends BaseController { + + private final IGenTableService genTableService; + + /** + * 查询代码生成列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageGenTableList(genTable, pageQuery); + } + + /** + * 修改代码生成业务 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:query") + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap<>(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return R.ok(map); + } + + /** + * 查询数据库列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageDbTableList(genTable, pageQuery); + } + + /** + * 查询数据表字段列表 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { + TableDataInfo dataInfo = new TableDataInfo<>(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + * + * @param tables 表名串 + */ + @SaCheckPermission("tool:gen:import") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public R importTableSave(String tables, String dataName) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames, dataName); + genTableService.importGenTable(tableList, dataName); + return R.ok(); + } + + /** + * 修改保存代码生成业务 + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public R editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return R.ok(); + } + + /** + * 删除代码生成 + * + * @param tableIds 表ID串 + */ + @SaCheckPermission("tool:gen:remove") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public R remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return R.ok(); + } + + /** + * 预览代码 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:preview") + @GetMapping("/preview/{tableId}") + public R> preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return R.ok(dataMap); + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableId}") + public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { + byte[] data = genTableService.downloadCode(tableId); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableId}") + public R genCode(@PathVariable("tableId") Long tableId) { + genTableService.generatorCode(tableId); + return R.ok(); + } + + /** + * 同步数据库 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableId}") + public R synchDb(@PathVariable("tableId") Long tableId) { + genTableService.synchDb(tableId); + return R.ok(); + } + + /** + * 批量生成代码 + * + * @param tableIdStr 表ID串 + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { + String[] tableIds = Convert.toStrArray(tableIdStr); + byte[] data = genTableService.downloadCode(tableIds); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + //response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), false, data); + } + + /** + * 查询数据源名称列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/getDataNames") + public R getCurrentDataSourceNameList(){ + return R.ok(DataBaseHelper.getDataSourceNameList()); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java new file mode 100644 index 0000000..19f94b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java @@ -0,0 +1,196 @@ +package org.dromara.gen.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.gen.constant.GenConstants; + +import java.util.List; + +/** + * 业务表 gen_table + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table") +public class GenTable extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "table_id") + private Long tableId; + + /** + * 数据源名称 + */ + @NotBlank(message = "数据源名称不能为空") + private String dataName; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** + * 表描述 + */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** + * 关联父表的表名 + */ + private String subTableName; + + /** + * 本表关联父表的外键名 + */ + private String subTableFkName; + + /** + * 实体类名称(首字母大写) + */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) + */ + private String tplCategory; + + /** + * 生成包路径 + */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** + * 生成模块名 + */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** + * 生成业务名 + */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** + * 生成功能名 + */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** + * 生成作者 + */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + + /** + * 生成路径(不填默认项目路径) + */ + @TableField(updateStrategy = FieldStrategy.NOT_EMPTY) + private String genPath; + + /** + * 主键信息 + */ + @TableField(exist = false) + private GenTableColumn pkColumn; + + /** + * 表列信息 + */ + @Valid + @TableField(exist = false) + private List columns; + + /** + * 其它生成选项 + */ + private String options; + + /** + * 备注 + */ + private String remark; + + /** + * 树编码字段 + */ + @TableField(exist = false) + private String treeCode; + + /** + * 树父编码字段 + */ + @TableField(exist = false) + private String treeParentCode; + + /** + * 树名称字段 + */ + @TableField(exist = false) + private String treeName; + + /* + * 菜单id列表 + */ + @TableField(exist = false) + private List menuIds; + + /** + * 上级菜单ID字段 + */ + @TableField(exist = false) + private String parentMenuId; + + /** + * 上级菜单名称字段 + */ + @TableField(exist = false) + private String parentMenuName; + + public boolean isTree() { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java new file mode 100644 index 0000000..b3fe7c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java @@ -0,0 +1,222 @@ +package org.dromara.gen.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.ibatis.type.JdbcType; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table_column") +public class GenTableColumn extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "column_id") + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isPk; + + /** + * 是否自增(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isIncrement; + + /** + * 是否必填(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isEdit; + + /** + * 是否列表字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isList; + + /** + * 是否查询字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public boolean isEdit() { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId"); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append(StringUtils.EMPTY).append(startStr).append("=").append(endStr).append(StringUtils.SEPARATOR); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..501f0c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java @@ -0,0 +1,28 @@ +package org.dromara.gen.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.List; + +/** + * 业务字段 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableColumnMapper extends BaseMapperPlus { + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + @DS("#dataName") + List selectDbTableColumnsByName(@Param("tableName") String tableName, String dataName); + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java new file mode 100644 index 0000000..2567c89 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java @@ -0,0 +1,61 @@ +package org.dromara.gen.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.gen.domain.GenTable; + +import java.util.List; + +/** + * 业务 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableMapper extends BaseMapperPlus { + + /** + * 查询据库列表 + * + * @param genTable 查询条件 + * @return 数据库表集合 + */ + Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + GenTable selectGenTableByName(String tableName); + + @DS("") + List selectTableNameList(String dataName); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java new file mode 100644 index 0000000..9031760 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -0,0 +1,466 @@ +package org.dromara.gen.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; +import org.dromara.gen.mapper.GenTableColumnMapper; +import org.dromara.gen.mapper.GenTableMapper; +import org.dromara.gen.util.GenUtils; +import org.dromara.gen.util.VelocityInitializer; +import org.dromara.gen.util.VelocityUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class GenTableServiceImpl implements IGenTableService { + + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; + private final IdentifierGenerator identifierGenerator; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = baseMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + @Override + public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); + return TableDataInfo.build(page); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper + .eq(StringUtils.isNotEmpty(genTable.getDataName()),"data_name", genTable.getDataName()) + .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")); + return wrapper; + } + + @DS("#genTable.dataName") + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + genTable.getParams().put("genTableNames",baseMapper.selectTableNameList(genTable.getDataName())); + Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + @DS("#dataName") + @Override + public List selectDbTableListByNames(String[] tableNames, String dataName) { + return baseMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return baseMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void updateGenTable(GenTable genTable) { + String options = JsonUtils.toJsonString(genTable.getParams()); + genTable.setOptions(options); + int row = baseMapper.updateById(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateById(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteGenTableByIds(Long[] tableIds) { + List ids = Arrays.asList(tableIds); + baseMapper.deleteBatchIds(ids); + genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + @DSTransactional + @Override + public void importGenTable(List tableList, String dataName) { + Long operId = LoginHelper.getUserId(); + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operId); + table.setDataName(dataName); + int row = baseMapper.insert(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dataName); + List saveColumns = new ArrayList<>(); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + saveColumns.add(column); + } + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertBatch(saveColumns); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(Long tableId) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableId, zip); + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + @Override + public void generatorCode(Long tableId) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeUtf8String(sw.toString(), path); + } catch (Exception e) { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + @DSTransactional + @Override + public void synchDb(Long tableId) { + GenTable table = baseMapper.selectGenTableById(tableId); + List tableColumns = table.getColumns(); + Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + if (CollUtil.isEmpty(dbTableColumns)) { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = StreamUtils.toList(dbTableColumns, GenTableColumn::getColumnName); + + List saveColumns = new ArrayList<>(); + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + } + saveColumns.add(column); + }); + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertOrUpdateBatch(saveColumns); + } + List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); + if (CollUtil.isNotEmpty(delColumns)) { + List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); + if (CollUtil.isNotEmpty(ids)) { + genTableColumnMapper.deleteBatchIds(ids); + } + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableIds) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableId : tableIds) { + generatorCode(Long.parseLong(tableId), zip); + } + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(Long tableId, ZipOutputStream zip) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); + IoUtil.close(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JsonUtils.toJsonString(genTable.getParams()); + Dict paramsObj = JsonUtils.parseMap(options); + if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { + throw new ServiceException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { + throw new ServiceException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { + throw new ServiceException("树名称字段不能为空"); + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (ObjectUtil.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getStr(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} + diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java new file mode 100644 index 0000000..ea23c53 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java @@ -0,0 +1,132 @@ +package org.dromara.gen.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author Lion Li + */ +public interface IGenTableService { + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames, String dataName); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + */ + void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + void importGenTable(List tableList, String dataName); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + byte[] downloadCode(Long tableId); + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + void generatorCode(Long tableId); + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + void synchDb(Long tableId); + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + byte[] downloadCode(String[] tableIds); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + void validateEdit(GenTable genTable); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java new file mode 100644 index 0000000..214b181 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java @@ -0,0 +1,231 @@ +package org.dromara.gen.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.RegExUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.gen.config.GenConfig; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GenUtils { + + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, Long operId) { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operId); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), StringUtils.SEPARATOR); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // BO对象 默认插入勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_ADD, columnName) && !column.isPk()) { + column.setIsInsert(GenConstants.REQUIRE); + } + // BO对象 默认编辑勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { + column.setIsEdit(GenConstants.REQUIRE); + } + // BO对象 默认是否必填勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { + column.setIsRequired(GenConstants.REQUIRE); + } + // VO对象 默认返回勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName)) { + column.setIsList(GenConstants.REQUIRE); + } + // BO对象 默认查询勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) { + int firstIndex = tableName.indexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, firstIndex + 1, nameLength); + businessName = StringUtils.toCamelCase(businessName); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, StringUtils.SEPARATOR); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + */ + public static String replaceFirst(String replacementm, String[] searchList) { + String text = replacementm; + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { + text = replacementm.replaceFirst(searchString, StringUtils.EMPTY); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } else { + return 0; + } + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java new file mode 100644 index 0000000..68773b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java @@ -0,0 +1,35 @@ +package org.dromara.gen.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityInitializer { + + /** + * 初始化vm方法 + */ + public static void initVelocity() { + Properties p = new Properties(); + try { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java new file mode 100644 index 0000000..1206767 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java @@ -0,0 +1,344 @@ +package org.dromara.gen.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/remoteVo.java.vm"); + templates.add("vm/java/voConvert.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/ts/api.ts.vm"); + templates.add("vm/ts/types.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("remoteVo.java.vm")) { + fileName = StringUtils.format("{}/api/domain/Remote{}Vo.java", javaPath, className); + } + if (template.contains("voConvert.java.vm")) { + fileName = StringUtils.format("{}/domain/convert/{}VoConvert.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); + } else if (template.contains("types.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml new file mode 100644 index 0000000..253639b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Tomcat +server: + port: 9202 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-gen + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt new file mode 100644 index 0000000..05f528c --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + (_) + _ __ _ _ ___ _ _ _ ______ __ _ ___ _ __ +| '__|| | | | / _ \ | | | || ||______| / _` | / _ \| '_ \ +| | | |_| || (_) || |_| || | | (_| || __/| | | | +|_| \__,_| \___/ \__, ||_| \__, | \___||_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..0ef8ae4 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..8fedeb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..3f4f0ce --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm new file mode 100644 index 0000000..511d37c --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm @@ -0,0 +1,50 @@ +package ${packageName}.domain.bo; + +import ${packageName}.domain.${ClassName}; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +#foreach ($import in $importList) +import ${import}; +#end + +/** + * ${functionName}业务对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ${ClassName}.class, reverseConvertGenerate = false) +public class ${ClassName}Bo extends BaseEntity { + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.insert || $column.edit)) + /** + * $column.columnComment + */ +#if($column.insert && $column.edit) +#set($Group="AddGroup.class, EditGroup.class") +#elseif($column.insert) +#set($Group="AddGroup.class") +#elseif($column.edit) +#set($Group="EditGroup.class") +#end +#if($column.required) +#if($column.javaType == 'String') + @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) +#else + @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) +#end +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..a842537 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,116 @@ +package ${packageName}.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.service.I${ClassName}Service; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName} + * 前端访问路由地址为:/${moduleName}/${businessName} + * + * @author ${author} + * @date ${datetime} + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/${businessName}") +public class ${ClassName}Controller extends BaseController { + + private final I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:list") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo<${ClassName}Vo> list(${ClassName}Bo bo, PageQuery pageQuery) { + return ${className}Service.queryPageList(bo, pageQuery); + } +#elseif($table.tree) + public R> list(${ClassName}Bo bo) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + return R.ok(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(${ClassName}Bo bo, HttpServletResponse response) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); + } + + /** + * 获取${functionName}详细信息 + * + * @param ${pkColumn.javaField} 主键 + */ + @SaCheckPermission("${permissionPrefix}:query") + @GetMapping("/{${pkColumn.javaField}}") + public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空") + @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) { + return R.ok(${className}Service.queryById(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @SaCheckPermission("${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.insertByBo(bo)); + } + + /** + * 修改${functionName} + */ + @SaCheckPermission("${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.updateByBo(bo)); + } + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField}s 主键串 + */ + @SaCheckPermission("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + return toAjax(${className}Service.deleteWithValidByIds(List.of(${pkColumn.javaField}s), true)); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..205fb73 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,60 @@ +package ${packageName}.domain; + +#foreach ($column in $columns) +#if($column.javaField=='tenantId') +#set($IsTenant=1) +#end +#end +#if($IsTenant==1) +import org.dromara.common.tenant.core.TenantEntity; +#else +import org.dromara.common.mybatis.core.domain.BaseEntity; +#end +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +#foreach ($import in $importList) +import ${import}; +#end + +import java.io.Serial; + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($IsTenant==1) +#set($Entity="TenantEntity") +#else +#set($Entity="BaseEntity") +#end +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("${tableName}") +public class ${ClassName} extends ${Entity} { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** + * $column.columnComment + */ +#if($column.javaField=='delFlag') + @TableLogic +#end +#if($column.javaField=='version') + @Version +#end +#if($column.isPk==1) + @TableId(value = "$column.columnName") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..0922401 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,15 @@ +package ${packageName}.mapper; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> { + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm new file mode 100644 index 0000000..6f51acc --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm @@ -0,0 +1,42 @@ +package ${packageName}.api.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +public class Remote${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..d596a0e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,53 @@ +package ${packageName}.service; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +#end + +import java.util.Collection; +import java.util.List; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service { + + /** + * 查询${functionName} + */ + ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); +#end + + /** + * 查询${functionName}列表 + */ + List<${ClassName}Vo> queryList(${ClassName}Bo bo); + + /** + * 新增${functionName} + */ + Boolean insertByBo(${ClassName}Bo bo); + + /** + * 修改${functionName} + */ + Boolean updateByBo(${ClassName}Bo bo); + + /** + * 校验并批量删除${functionName}信息 + */ + Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..3cf3302 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,135 @@ +package ${packageName}.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +#end +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@RequiredArgsConstructor +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + + private final ${ClassName}Mapper baseMapper; + + /** + * 查询${functionName} + */ + @Override + public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ + return baseMapper.selectVoById(${pkColumn.javaField}); + } + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + @Override + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { + QueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } +#end + + /** + * 查询${functionName}列表 + */ + @Override + public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { + QueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { + Map params = bo.getParams(); + QueryWrapper<${ClassName}> lqw = new QueryWrapper<>(); +#foreach($column in $columns) +#if($column.query) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($mpMethod=$column.queryType.toLowerCase()) +#if($queryType != 'BETWEEN') +#if($javaType == 'String') +#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') +#else +#set($condition='bo.get'+$AttrName+'() != null') +#end + lqw.$mpMethod($condition, "$columnName", bo.get$AttrName()); +#else + lqw.between(params.get("begin$AttrName") != null && params.get("end$AttrName") != null, + "$columnName" ,params.get("begin$AttrName"), params.get("end$AttrName")); +#end +#end +#end + return lqw; + } + + /** + * 新增${functionName} + */ + @Override + public Boolean insertByBo(${ClassName}Bo bo) { + ${ClassName} add = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; +#set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) + if (flag) { + bo.set$pk(add.get$pk()); + } + return flag; + } + + /** + * 修改${functionName} + */ + @Override + public Boolean updateByBo(${ClassName}Bo bo) { + ${ClassName} update = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(${ClassName} entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除${functionName} + */ + @Override + public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm new file mode 100644 index 0000000..f99a2ed --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm @@ -0,0 +1,59 @@ +package ${packageName}.domain.vo; + +#foreach ($import in $importList) +import ${import}; +#end +import ${packageName}.domain.${ClassName}; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ${ClassName}.class) +public class ${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if(${column.dictType} && ${column.dictType} != '') + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "${column.dictType}") +#elseif($parentheseIndex != -1) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") +#else + @ExcelProperty(value = "${comment}") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm new file mode 100644 index 0000000..ba8107b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm @@ -0,0 +1,19 @@ +package ${packageName}.domain.convert; + +import io.github.linpeilie.BaseMapper; +import ${packageName}.api.domain.Remote${ClassName}Vo; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * ${functionName}Convert接口 + * + * @author ${author} + * @date ${datetime} + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface ${ClassName}VoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm new file mode 100644 index 0000000..f6638be --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate, null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate, null, null, ''); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm new file mode 100644 index 0000000..0923392 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm @@ -0,0 +1,20 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, now(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, now(), null, null, ''); + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..01824c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm new file mode 100644 index 0000000..3aa4a5f --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { ${BusinessName}VO, ${BusinessName}Form, ${BusinessName}Query } from '@/api/${moduleName}/${businessName}/types'; + +/** + * 查询${functionName}列表 + * @param query + * @returns {*} + */ + +export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }); +}; + +/** + * 查询${functionName}详细 + * @param ${pkColumn.javaField} + */ +export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }); +}; + +/** + * 新增${functionName} + * @param data + */ +export const add${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }); +}; + +/** + * 修改${functionName} + * @param data + */ +export const update${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }); +}; + +/** + * 删除${functionName} + * @param ${pkColumn.javaField} + */ +export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array) => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }); +}; diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm new file mode 100644 index 0000000..4e0ab5e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm @@ -0,0 +1,50 @@ +export interface ${BusinessName}VO { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +#if ($table.tree) + /** + * 子对象 + */ + children: ${BusinessName}VO[]; +#end +} + +export interface ${BusinessName}Form extends BaseEntity { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} + +export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{ +#foreach ($column in $columns) +#if($column.query) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..f876f55 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,507 @@ + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6ba61fc --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..9fb48d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-job/Dockerfile b/ruoyi-modules/ruoyi-job/Dockerfile new file mode 100644 index 0000000..2922d84 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/job/logs \ + /ruoyi/job/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/job + +ENV SERVER_PORT=9203 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-job.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-job \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml new file mode 100644 index 0000000..6b92a99 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -0,0 +1,105 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-job + + + ruoyi-job 任务调度模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-job + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + org.dromara + ruoyi-common-security + + + + + org.dromara + ruoyi-api-system + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java new file mode 100644 index 0000000..ddc03d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java @@ -0,0 +1,24 @@ +package org.dromara.job; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 任务调度模块 + * + * @author Lion Li + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiJobApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiJobApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 任务调度模块启动成功 ლ(´ڡ`ლ)゙ "); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java new file mode 100644 index 0000000..2b4c28a --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java @@ -0,0 +1,56 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.common.utils.NetUtils; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.TaskResult; +import tech.powerjob.worker.core.processor.sdk.BroadcastProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.List; + +/** + * 广播处理器 示例 + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class BroadcastProcessorDemo implements BroadcastProcessor { + + @Override + public ProcessResult preProcess(TaskContext context) { + System.out.println("===== BroadcastProcessorDemo#preProcess ======"); + context.getOmsLogger().info("BroadcastProcessorDemo#preProcess, current host: {}", NetUtils.getLocalHost()); + if ("rootFailed".equals(context.getJobParams())) { + return new ProcessResult(false, "console need failed"); + } else { + return new ProcessResult(true); + } + } + + @Override + public ProcessResult process(TaskContext taskContext) throws Exception { + OmsLogger logger = taskContext.getOmsLogger(); + System.out.println("===== BroadcastProcessorDemo#process ======"); + logger.info("BroadcastProcessorDemo#process, current host: {}", NetUtils.getLocalHost()); + long sleepTime = 1000; + try { + sleepTime = Long.parseLong(taskContext.getJobParams()); + } catch (Exception e) { + logger.warn("[BroadcastProcessor] parse sleep time failed!", e); + } + Thread.sleep(Math.max(sleepTime, 1000)); + return new ProcessResult(true); + } + + @Override + public ProcessResult postProcess(TaskContext context, List taskResults) { + System.out.println("===== BroadcastProcessorDemo#postProcess ======"); + context.getOmsLogger().info("BroadcastProcessorDemo#postProcess, current host: {}, taskResult: {}", NetUtils.getLocalHost(), taskResults); + return new ProcessResult(true, "success"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java new file mode 100644 index 0000000..2a1000f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java @@ -0,0 +1,41 @@ +package org.dromara.job.processors; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; +import tech.powerjob.official.processors.util.CommonUtils; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.Optional; + +/** + * LogTestProcessor + * + * @author tjq + * @since 2022/9/18 + */ +@Component +public class LogTestProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + final OmsLogger omsLogger = context.getOmsLogger(); + final String parseParams = CommonUtils.parseParams(context); + final JSONObject config = Optional.ofNullable(JSONObject.parseObject(parseParams)).orElse(new JSONObject()); + + final long loopTimes = Optional.ofNullable(config.getLong("loopTimes")).orElse(1000L); + + for (int i = 0; i < loopTimes; i++) { + omsLogger.debug("[DEBUG] one DEBUG log in {}", new Date()); + omsLogger.info("[INFO] one INFO log in {}", new Date()); + omsLogger.warn("[WARN] one WARN log in {}", new Date()); + omsLogger.error("[ERROR] one ERROR log in {}", new Date()); + } + + return new ProcessResult(true); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java new file mode 100644 index 0000000..720d333 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java @@ -0,0 +1,93 @@ +package org.dromara.job.processors; + +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.dromara.common.json.utils.JsonUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.MapProcessor; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * Map处理器 示例 + * + * @author tjq + * @since 2020/4/18 + */ +@Component +public class MapProcessorDemo implements MapProcessor { + + + /** + * 每一批发送任务大小 + */ + private static final int BATCH_SIZE = 100; + /** + * 发送的批次 + */ + private static final int BATCH_NUM = 5; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + log.info("============== MapProcessorDemo#process =============="); + log.info("isRootTask:{}", isRootTask()); + log.info("taskContext:{}", JsonUtils.toJsonString(context)); + + if (isRootTask()) { + log.info("==== MAP ===="); + List subTasks = Lists.newLinkedList(); + for (int j = 0; j < BATCH_NUM; j++) { + SubTask subTask = new SubTask(); + subTask.siteId = j; + subTask.itemIds = Lists.newLinkedList(); + subTasks.add(subTask); + for (int i = 0; i < BATCH_SIZE; i++) { + subTask.itemIds.add(i + j * 100); + } + } + map(subTasks, "MAP_TEST_TASK"); + return new ProcessResult(true, "map successfully"); + } else { + + log.info("==== PROCESS ===="); + SubTask subTask = (SubTask) context.getSubTask(); + for (Integer itemId : subTask.getItemIds()) { + if (Thread.interrupted()) { + // 任务被中断 + log.info("job has been stop! so stop to process subTask: {} => {}", subTask.getSiteId(), itemId); + break; + } + log.info("processing subTask: {} => {}", subTask.getSiteId(), itemId); + int max = Integer.MAX_VALUE >> 7; + for (int i = 0; ; i++) { + // 模拟耗时操作 + if (i > max) { + break; + } + } + } + // 测试在 Map 任务中追加上下文 + context.getWorkflowContext().appendData2WfContext("Yasuo", "A sword's poor company for a long road."); + boolean b = ThreadLocalRandom.current().nextBoolean(); + if (context.getCurrentRetryTimes() >= 1) { + // 重试的话一定会成功 + b = true; + } + return new ProcessResult(b, "RESULT:" + b); + } + } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class SubTask { + private Integer siteId; + private List itemIds; + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java new file mode 100644 index 0000000..1498854 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java @@ -0,0 +1,93 @@ +package org.dromara.job.processors; + +import cn.hutool.core.lang.Dict; +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.utils.JsonUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.TaskResult; +import tech.powerjob.worker.core.processor.sdk.MapReduceProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * MapReduce 处理器示例 + * 控制台参数:{"batchSize": 100, "batchNum": 2} + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class MapReduceProcessorDemo implements MapReduceProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + OmsLogger omsLogger = context.getOmsLogger(); + + log.info("============== TestMapReduceProcessor#process =============="); + log.info("isRootTask:{}", isRootTask()); + log.info("taskContext:{}", JsonUtils.toJsonString(context)); + + // 根据控制台参数获取MR批次及子任务大小 + final Dict jobParams = JsonUtils.parseMap(context.getJobParams()); + + Integer batchSize = (Integer) jobParams.getOrDefault("batchSize", 100); + Integer batchNum = (Integer) jobParams.getOrDefault("batchNum", 10); + + if (isRootTask()) { + log.info("==== MAP ===="); + omsLogger.info("[DemoMRProcessor] start root task~"); + List subTasks = Lists.newLinkedList(); + for (int j = 0; j < batchNum; j++) { + for (int i = 0; i < batchSize; i++) { + int x = j * batchSize + i; + subTasks.add(new TestSubTask("name" + x, x)); + } + map(subTasks, "MAP_TEST_TASK"); + subTasks.clear(); + } + omsLogger.info("[DemoMRProcessor] map success~"); + return new ProcessResult(true, "MAP_SUCCESS"); + } else { + log.info("==== NORMAL_PROCESS ===="); + omsLogger.info("[DemoMRProcessor] process subTask: {}.", JsonUtils.toJsonString(context.getSubTask())); + log.info("subTask: {}", JsonUtils.toJsonString(context.getSubTask())); + Thread.sleep(1000); + if (context.getCurrentRetryTimes() == 0) { + return new ProcessResult(false, "FIRST_FAILED"); + } else { + return new ProcessResult(true, "PROCESS_SUCCESS"); + } + } + } + + @Override + public ProcessResult reduce(TaskContext context, List taskResults) { + log.info("================ MapReduceProcessorDemo#reduce ================"); + log.info("TaskContext: {}", JsonUtils.toJsonString(context)); + log.info("List: {}", JsonUtils.toJsonString(taskResults)); + context.getOmsLogger().info("MapReduce job finished, result is {}.", taskResults); + + boolean success = ThreadLocalRandom.current().nextBoolean(); + return new ProcessResult(success, context + ": " + success); + } + + @Getter + @ToString + @NoArgsConstructor + @AllArgsConstructor + public static class TestSubTask { + private String name; + private int age; + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java new file mode 100644 index 0000000..3342cfe --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java @@ -0,0 +1,35 @@ +package org.dromara.job.processors; + +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Optional; + +/** + * @author Echo009 + * @since 2022/4/27 + */ +@Component +public class SimpleProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + OmsLogger logger = context.getOmsLogger(); + + String jobParams = Optional.ofNullable(context.getJobParams()).orElse("S"); + logger.info("Current context:{}", context.getWorkflowContext()); + logger.info("Current job params:{}", jobParams); + + // 测试中文问题 #581 + if (jobParams.contains("CN")) { + return new ProcessResult(true, "任务成功啦!!!"); + } + + return jobParams.contains("F") ? new ProcessResult(false) : new ProcessResult(true, "yeah!"); + + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java new file mode 100644 index 0000000..ea8eff3 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java @@ -0,0 +1,51 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Collections; + +/** + * 单机处理器 示例 + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class StandaloneProcessorDemo implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + OmsLogger omsLogger = context.getOmsLogger(); + omsLogger.info("StandaloneProcessorDemo start process,context is {}.", context); + omsLogger.info("Notice! If you want this job process failed, your jobParams need to be 'failed'"); + omsLogger.info("Let's test the exception~"); + // 测试异常日志 + try { + Collections.emptyList().add("277"); + } catch (Exception e) { + omsLogger.error("oh~it seems that we have an exception~", e); + } + log.info("================ StandaloneProcessorDemo#process ================"); + log.info("jobParam:{}", context.getJobParams()); + log.info("instanceParams:{}", context.getInstanceParams()); + String param; + // 解析参数,非处于工作流中时,优先取实例参数(允许动态[instanceParams]覆盖静态参数[jobParams]) + if (context.getWorkflowContext() == null) { + param = StringUtils.isBlank(context.getInstanceParams()) ? context.getJobParams() : context.getInstanceParams(); + } else { + param = context.getJobParams(); + } + // 根据参数判断是否成功 + boolean success = !"failed".equals(param); + omsLogger.info("StandaloneProcessorDemo finished process,success: {}", success); + omsLogger.info("anyway, we finished the job successfully~Congratulations!"); + return new ProcessResult(success, context + ": " + success); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java new file mode 100644 index 0000000..4b5899f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java @@ -0,0 +1,25 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +/** + * 测试超时任务(可中断) + * + * @author tjq + * @since 2020/4/20 + */ +@Component +@Slf4j +public class TimeoutProcessor implements BasicProcessor { + @Override + public ProcessResult process(TaskContext context) throws Exception { + long sleepTime = Long.parseLong(context.getJobParams()); + log.info("TaskInstance({}) will sleep {} ms", context.getInstanceId(), sleepTime); + Thread.sleep(Long.parseLong(context.getJobParams())); + return new ProcessResult(true, "impossible~~~~QAQ~"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java new file mode 100644 index 0000000..51187e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java @@ -0,0 +1,36 @@ +package org.dromara.job.workflow; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Map; + +/** + * 工作流测试 + * + * @author tjq + * @since 2020/6/2 + */ +@Component +@Slf4j +public class WorkflowStandaloneProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + OmsLogger logger = context.getOmsLogger(); + logger.info("current jobParams: {}", context.getJobParams()); + logger.info("current context: {}", context.getWorkflowContext()); + log.info("jobParams:{}", context.getJobParams()); + log.info("currentContext:{}", JSON.toJSONString(context)); + + // 尝试获取上游任务 + Map workflowContext = context.getWorkflowContext().fetchWorkflowContext(); + log.info("工作流上下文数据:{}", workflowContext); + return new ProcessResult(true, context.getJobId() + " process successfully."); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/application.yml b/ruoyi-modules/ruoyi-job/src/main/resources/application.yml new file mode 100644 index 0000000..77fda0c --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9203 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-job + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt new file mode 100644 index 0000000..683f20c --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) (_) | | + _ __ _ _ ___ _ _ _ ______ _ ___ | |__ +| '__| | | |/ _ \| | | | |______| |/ _ \| '_ \ +| | | |_| | (_) | |_| | | | | (_) | |_) | +|_| \__,_|\___/ \__, |_| | |\___/|_.__/ + __/ | _/ | + |___/ |__/ diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-mp/pom.xml b/ruoyi-modules/ruoyi-mp/pom.xml new file mode 100644 index 0000000..645e216 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/pom.xml @@ -0,0 +1,174 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-mp + + + ruoyi-mp公众号 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.987 + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + + org.dromara + ruoyi-api-settlement + + + + + + org.dromara + ruoyi-api-mp + + + org.dromara + ruoyi-api-settlement + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java new file mode 100644 index 0000000..6291267 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java @@ -0,0 +1,31 @@ +package org.dromara.mp; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * @author sunzexing + * @version 1.0 + * @title RuoYiMpApplication + * @description + * @create 2024-03-28 14:27 + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiMpApplication { + + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiMpApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 公众号模块启动成功 ლ(´ڡ`ლ)゙ "); + + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java new file mode 100644 index 0000000..7447c7f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java @@ -0,0 +1,204 @@ +package org.dromara.mp.controller; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.service.ICardIdService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title CardIdController + * @description 身份证信息 + * @create 2024-04-01 17:26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cardId") +@Slf4j +public class CardIdController extends BaseController { + + + @Resource + public ICardIdService cardIdService; + +// @Log(title = "身份证识别", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Log(title = "身份证识别", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R idCardOcr(@RequestPart("file") MultipartFile file, String type,String code ){ + if (ObjectUtil.isNull(file)|| file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + Map reultMap = null; + try{ + reultMap = this.cardIdService.idCardOcr(file,type,code); + }catch(Exception e){ + e.printStackTrace(); + log.error("身份证识别错误===>"+e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(reultMap); + } + + /** + * 银行卡识别上传接口 + * 使用OCR技术对上传的银行卡图片进行识别,并返回识别结果。 + * @param file 上传的银行卡图片文件,必须是multipart/form-data类型。 + * @param code 业务代码或标识,可用于特定的业务逻辑处理。 + * @return 返回一个包含识别结果的Map对象,如果失败则返回错误信息。 + */ + @PostMapping(value = "/bankUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Log(title = "银行卡识别上传接口", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R bankUploadOcr(@RequestPart("file") MultipartFile file, String code) { + // 检查上传的文件是否为空 + if (ObjectUtil.isNull(file) || file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + Map reultMap = null; + try { + // 调用服务进行银行卡识别处理 + reultMap = this.cardIdService.bankUploadOcr(file, null, code); + } catch (Exception e) { + e.printStackTrace(); + log.error("银行卡识别错误===>"+e.getMessage()); + return R.fail("银行卡识别错误"); + } + // 返回识别结果 + return R.ok(reultMap); + } + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 10:46 + * 说明:身份证识别信息提交 + **/ + @PostMapping(value = "/authSubmit") + @Log(title = "身份证识别信息提交", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R submitIdCardInfo(@Validated(AddGroup.class) UserWorkerBo userWorkerBo, String code)throws Exception{ + Map resultMap = this.cardIdService.submitIdCardInfo(userWorkerBo,code); + return R.ok(resultMap); + } + + + + + + /** + * 提交银行认证信息 + * @param cardNo 银行卡号 + * @param code 验证码 + * @param bankImg 银行卡图片 + * @param bankInfo 银行信息 + * @param cardType 卡类型 + * @param cardName 卡名称 + * @param phone 手机号 + * @param channelName 通道名称 + * @return 返回认证结果,包含认证状态和相关信息 + * @throws Exception 处理过程中可能抛出的异常 + */ + @PostMapping(value = "/bankAuth") + @Log(title = "提交银行认证信息", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R submitBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName) throws Exception{ + + Map resultMap = new HashMap(); + resultMap = this.cardIdService.bankAuth4(cardNo,code,bankImg,bankInfo,cardType,cardName,phone,channelName); + return R.ok(resultMap); + } + + + + + /** + * 修改银行卡信息 + * @param cardNo 银行卡号 + * @param code 验证码 + * @param bankImg 银行卡图片 + * @param bankInfo 银行信息 + * @param cardType 卡类型 + * @param cardName 卡名称 + * @param phone 手机号 + * @param id 银行卡ID + * @return 返回认证结果,包含认证状态和相关信息 + * @throws Exception 处理过程中可能抛出的异常 + */ + @PostMapping(value = "/mdyBank") + @Log(title = "修改银行卡信息", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id) throws Exception{ + return R.ok(this.cardIdService.mdyBank(cardNo,code,bankImg,bankInfo,cardType,cardName,phone,id)); + } + + + /*** + * 获取用户信息 + * @return + */ + @GetMapping(value = "/getInfo") + @Log(title = "获取用户信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getUserInfo(){ + return R.ok(this.cardIdService.getUserInfo()); + } + + + + + @GetMapping(value = "/getCardInfo") + @Log(title = "获取身份信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getUserCardInfo(){ + return R.ok(this.cardIdService.getUserCardInfo()); + } + + + + /**** + * 获取人身核验地址 + * @param code + * @return + * @throws Exception + */ + @GetMapping(value = "/getFa") + @Log(title = "获取人身核验地址", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getFaceAuth(String code)throws Exception{ + return R.ok(this.cardIdService.getFaceAuth(code)); + } + + + /**** + * 获取人脸核验结果 + * @param bizToken 人脸核验token + * @return + * @throws Exception + */ + + @GetMapping(value = "/getFaResult") + @Log(title = "获取人脸核验结果", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getFaceAuthResult(String bizToken,String code)throws Exception{ + return R.ok(this.cardIdService.getFaceAuthResult(bizToken, code)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java new file mode 100644 index 0000000..5adba88 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java @@ -0,0 +1,232 @@ +package org.dromara.mp.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; +import org.dromara.mp.service.IMyTaskService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskController + * @description + * @create 2024-05-08 18:46 + */ +@RestController +@RequestMapping("/task") +public class MyTaskController extends BaseController { + + @Resource + public IMyTaskService taskService; + + + /*** + * 任务广场 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/taskList") + @Log(title = "任务广场", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selTastList(String name, PageQuery pageQuery){ + return taskService.selTastList(name,pageQuery); + } + + + + /*** + * 任务广场 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/myTaskList") + @Log(title = "我的任务", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selMyTastList(String name, PageQuery pageQuery){ + return taskService.selMyTastList(name,pageQuery); + } + + + /**** + * 任务广场-任务详情 + * @param id + * @return + */ + @GetMapping("/taskListDetail") + @Log(title = "任务详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R selTaskListDetail(Long id){ + return R.ok(taskService.selTaskListDetail(id)); + } + + + /*** + * 请求任务 + * @param id 项目ID + * @param no 项目编码 + * @return + */ + @PostMapping("/accept") + @Log(title = "接收任务", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R acceptTask(Long id,String no){ + return R.ok(taskService.acceptTask(id,no)); + } + + + + /*** + * 签到-项目列表 + * @return + */ + @PostMapping("/selMyCheckPro") + @Log(title = "签到项目列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R> selMyCheckPro(){ + return R.ok(taskService.selMyCheckPro()); + } + + + + + /*** + * 我的任务-任务详情 + * @return + */ + @GetMapping("/myTaskDetail") + @Log(title = "我的任务-任务详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R selMyTaskDetail(Long id){ + return R.ok(taskService.selMyTaskDetail(id)); + } + + + + + /*** + * 我的任务-提交完工报告 + * @return + */ + @PostMapping("/updOverReport") + @Log(title = "我的任务-提交完工报告", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R updOverReport(MerTaskEnroll enroll){ + return R.ok(taskService.updOverReport(enroll)); + } + + + /*** + * 我的任务-查询完工报告 + * @return + */ + @GetMapping("/getOverReport") + @Log(title = "我的任务-查看完工报告", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R selOverReport(Long id) { + return R.ok(taskService.selOverReport(id)); + } + + + + /*** + * 我的合同列表 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/getMyHts") + @Log(title = "我的合同列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo getMyHts(String name, PageQuery pageQuery){ + return taskService.selMyHtList(name,pageQuery); + } + + + + /*** + * + * 我的项目确认单 + * @param name + * @param pageQuery + * @return + * + */ + @GetMapping("/proSureDoc") + @Log(title = "我的项目确认单", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selProSureDoc(String name, PageQuery pageQuery){ + return taskService.selProSureDoc(name,pageQuery); + } + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getSignUrl") + @Log(title = "获取签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getSignUrl(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signPro(id,domain)); + } + + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getSureSigUrl") + @Log(title = "获取确认单签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R signSurePro(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signSurePro(id,domain)); + } + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getJzqSignUrl") + @GetMapping("/getSignUrl") + @Log(title = "获取签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getJzqSignUrl(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signProJzq(id,domain)); + } + + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getJzqSureSigUrl") + @GetMapping("/getSureSigUrl") + @Log(title = "获取确认单签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R JzqsignSurePro(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signSureProJzq(id,domain)); + } + + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java new file mode 100644 index 0000000..6bc083f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java @@ -0,0 +1,71 @@ +package org.dromara.mp.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.mp.service.ISettlementAccountService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementAccountController + * @description 个人中心-结算账户 + * @create 2024-05-08 14:09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sac") +@Slf4j +public class SettlementAccountController extends BaseController { + + + @Resource + private ISettlementAccountService settlementAccountService; + + + /*** + * 获取结算通道 + * @return + */ + @GetMapping("/getSettleChannel") + @Log(title = "获取结算通道", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + +// @Log(title = "公众号获取结算通道", businessType = BusinessType.SELECT) + public R getSettleChannel(){ + return R.ok(this.settlementAccountService.getSettleChannel()); + } + + + + @GetMapping("/getBanks") + @Log(title = "获取银行列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) +// @Log(title = "公众号获取银行", businessType = BusinessType.SELECT) + public R getBankList(String bankName){ + return R.ok(this.settlementAccountService.getBankList(bankName)); + } + + + + + @GetMapping("/getDetail") +// @Log(title = "公众号获取银行卡详情", businessType = BusinessType.SELECT) + @Log(title = "获取银行卡详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getBankDetail(Long id){ + return R.ok(this.settlementAccountService.getBankDetail(id)); + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java new file mode 100644 index 0000000..8d9708a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java @@ -0,0 +1,53 @@ +package org.dromara.mp.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.mp.service.ISysUnitDomainService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 单位域名配置 + * 前端访问路由地址为:/mp/unitDomain + * + * @author LionLi + * @date 2024-04-07 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unitDomain") +public class SysUnitDomainController extends BaseController { + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 查询单位域名配置列表 + */ + @GetMapping("/selSiteInfo") + @SaIgnore + @Log(title = "查询单位域名配置列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R list(String mpDomain) { + return R.ok(sysUnitDomainService.queryByMpDomain(mpDomain)); + } + + + + @GetMapping("/sendSms") + @SaIgnore + @Log(title = "发送短信验证码", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R sendSms(String phone,String domainCode){ + return R.ok(this.sysUnitDomainService.sendSms(phone,domainCode)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java new file mode 100644 index 0000000..a06f78a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java @@ -0,0 +1,102 @@ +package org.dromara.mp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.service.IUserWorkCheckinService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者打卡记录 + * 前端访问路由地址为:/mp/workCheckin + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workCheckin") +public class UserWorkCheckinController extends BaseController { + + private final IUserWorkCheckinService userWorkCheckinService; + + /** + * 查询自雇者打卡记录列表 + */ + @GetMapping("/list") + @Log(title = "查询自雇者打卡记录列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R> list(UserWorkCheckinBo bo, PageQuery pageQuery) { + bo.setUserWorkId(MpLoginHelper.getUserId()); + return R.ok(userWorkCheckinService.queryList(bo)); + } + + /** + * 导出自雇者打卡记录列表 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkCheckinBo bo, HttpServletResponse response) { + List list = userWorkCheckinService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者打卡记录", UserWorkCheckinVo.class, response); + } + + /** + * 获取自雇者打卡记录详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + @Log(title = "获取自雇者打卡记录详细信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkCheckinService.queryById(id)); + } + + /** + * 新增自雇者打卡记录 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkCheckinBo bo) { + bo.setUserWorkId(MpLoginHelper.getUserId()); + return toAjax(userWorkCheckinService.insertByBo(bo)); + } + + /** + * 修改自雇者打卡记录 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkCheckinBo bo) { + return toAjax(userWorkCheckinService.updateByBo(bo)); + } + + /** + * 删除自雇者打卡记录 + * + * @param ids 主键串 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkCheckinService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java new file mode 100644 index 0000000..5eea04a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java @@ -0,0 +1,115 @@ +package org.dromara.mp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.log.enums.OperatorType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者 + * 前端访问路由地址为:/mp/worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/worker") +public class UserWorkerController extends BaseController { + + private final IUserWorkerService userWorkerService; + + + + + + + + + /** + * 查询自雇者列表 + */ + @SaCheckPermission("mp:worker:list") + @GetMapping("/list") + @Log(title = "查询自雇者列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo list(UserWorkerBo bo, PageQuery pageQuery) { + return userWorkerService.queryPageList(bo, pageQuery); + } + + /** + * 导出自雇者列表 + */ + @SaCheckPermission("mp:worker:export") + @Log(title = "自雇者", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerBo bo, HttpServletResponse response) { + List list = userWorkerService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者", UserWorkerVo.class, response); + } + + /** + * 获取自雇者详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("mp:worker:query") + @GetMapping("/{id}") + @Log(title = "获取自雇者详细信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerService.queryById(id)); + } + + /** + * 新增自雇者 + */ + @SaCheckPermission("mp:worker:add") + @Log(title = "自雇者", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.insertByBo(bo)); + } + + /** + * 修改自雇者 + */ + @SaCheckPermission("mp:worker:edit") + @Log(title = "自雇者", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.updateByBo(bo)); + } + + /** + * 删除自雇者 + * + * @param ids 主键串 + */ + @SaCheckPermission("mp:worker:remove") + @Log(title = "自雇者", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerService.deleteWithValidByIds(List.of(ids), true)); + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java new file mode 100644 index 0000000..2a1dd7b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java @@ -0,0 +1,222 @@ +package org.dromara.mp.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@RequestMapping("/demo") +public class dome { + + @PostMapping(value = "/testV3") + public String testV3()throws Exception + { +// String apiUrl = "http://192.168.124.5:8090/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + // 构建请求参数对象 + BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto = new BecomeSilentSaveSingleSignatureDto(); + becomeSilentSaveSignDto.setApplicationId("2205026100");//应用id + becomeSilentSaveSignDto.setBusinessId("95d6eb9ae14b4b6f8770467a37132c82");//合作方ID + becomeSilentSaveSignDto.setContractName("测试合同9220");//合同名称 + becomeSilentSaveSignDto.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + becomeSilentSaveSignDto.setLaunchSubject("13839900475");//发起用户手机号 + becomeSilentSaveSignDto.setLaunchEnterpriseName("郑州沃薪科技有限公司");//发起企业名称(launchType为1企业发起合同时必传) + becomeSilentSaveSignDto.setSignEnterpriseName("郑州沃薪科技有限公司");//静默签署企业名 + +// becomeSilentSaveSignDto.setSignEnterpriseName("常州钢构建设工程有限公司厦门分公司");//静默签署企业名 + becomeSilentSaveSignDto.setCustomerOriginationNumber("8374673663338222");//客户发起时定义的编号 + becomeSilentSaveSignDto.setInputValues("郑州沃薪科技有限公司,孙泽星,41152119850526,王舟舟,郑州沃薪科技有限公司,郑州沃薪科技有限公司,郑州沃薪科技有限公司,郑州沃薪科技有限公司,2024-05-31");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + becomeSilentSaveSignDto.setContractModelNum("2024053111351717126553386040");//模板编号 + becomeSilentSaveSignDto.setSignatureType("0"); + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName","孙泽星");//经办人姓名 + map.put("userPhone","15981832697");//经办人手机号 + map.put("type","0");//类型 0-个人 1-企业 + map.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + // map.put("type","1");//类型 0-个人 1-企业 + // map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + // map.put("enterpriseName","贵州省七进制科技有限公司");//企业名称(类型type为1时必传) + data.add(map); + String s = JSONObject.toJSONString(data); + becomeSilentSaveSignDto.setSignatoryInfos(s);//签署方相关信息 + + String response = callThirdPartyApi(apiUrl, becomeSilentSaveSignDto); + + + System.out.println(response); + return null; + + } + + + public static void main(String[] args) throws Exception{ + dome d = new dome(); + d.testV3(); + } + + + + @PostMapping(value = "/testV4") + public String testV4()throws Exception + { +// String apiUrl = "http://192.168.124.5:8090/openAPI/contractSign/v4/becomeSilentSaveSign"; // 替换为实际的API地址 + + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v2/becomeSilentSaveSign"; + //String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v4/becomeSilentSaveSign"; // 替换为实际的API地址 + // 构建请求参数对象 + BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto = new BecomeSilentSaveSingleSignatureDto(); + becomeSilentSaveSignDto.setApplicationId("2205026100");//应用id + becomeSilentSaveSignDto.setBusinessId("95d6eb9ae14b4b6f8770467a37132c82");//合作方ID + becomeSilentSaveSignDto.setContractName("测试合同92");//合同名称 + becomeSilentSaveSignDto.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + becomeSilentSaveSignDto.setLaunchSubject("18137182576");//发起用户手机号 + becomeSilentSaveSignDto.setLaunchEnterpriseName("郑州沃薪科技有限公司");//发起企业名称(launchType为1企业发起合同时必传) + becomeSilentSaveSignDto.setCustomerOriginationNumber("83746736681111223");//客户发起时定义的编号 + becomeSilentSaveSignDto.setInputValues("");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + becomeSilentSaveSignDto.setSignatureType("0"); +// becomeSilentSaveSignDto.setInputValues("");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 +// becomeSilentSaveSignDto.setContractModelNum("2024041717141713345299606662");//模板编号 + becomeSilentSaveSignDto.setContractModelNum("2024041717141713345299606662");//模板编号 + + +// 2024041717001713344451988901 + PcSignatoryDto pc = new PcSignatoryDto(); + pc.setUserName("罗啊啊");//姓名 + pc.setUserPhone("15981832697");//手机号 + pc.setEnterpriseName("常州钢构建设分公司");//公司名称 + pc.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 +// pc.setSignLevel(1);//签署顺序 + pc.setType(0);//类型 0-个人 1-企业 + + + PcSignatoryDto pc1 = new PcSignatoryDto(); + pc1.setUserName("孙**");//姓名 + pc1.setUserPhone("1563**090");//手机号 + pc1.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 + pc1.setSignLevel(2);//签署顺序 + pc1.setType(0);//类型 0-个人 1-企业 + + + PcSignatoryDto pc2 = new PcSignatoryDto(); + pc2.setUserName("魏**");//姓名 + pc2.setUserPhone("1563**090");//手机号 + pc2.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 + pc2.setSignLevel(3);//签署顺序 + pc2.setType(0);//类型 0-个人 1-企业 + List enterpriseSignDtoList=new ArrayList<>(); + enterpriseSignDtoList.add(pc); +// enterpriseSignDtoList.add(pc1); +// enterpriseSignDtoList.add(pc2); +// becomeSilentSaveSignDto.setSignatoryInfos(enterpriseSignDtoList); + + String response = callThirdPartyApi(apiUrl, becomeSilentSaveSignDto); + System.out.println(response); + + + return null; + } + + + public static String callThirdPartyApi(String apiUrl, BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(apiUrl); + + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(becomeSilentSaveSignDto); + + System.out.println(requestBody); + StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); + httpPost.setEntity(requestEntity); + + CloseableHttpResponse response = httpClient.execute(httpPost); + try { + HttpEntity entity = response.getEntity(); + BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); + StringBuilder responseBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + responseBuilder.append(line); + } + return responseBuilder.toString(); + } finally { + response.close(); + } + } + + + + + +} + + + +@Data +class BecomeSilentSaveSingleSignatureDto{ + + private String applicationId; + + private String businessId; + + private String launchType; + + private String launchSubject; + + private String launchEnterpriseName; + + private String customerOriginationNumber; + private String contractModelNum; + private String signEnterpriseName; + private String contractName; + private String signatoryInfos; + + private String inputValues; + + private String signatureType; + + + + +// private List signatoryInfos; + + + + +} + + +@Data +class PcSignatoryDto{ + + private String userName; + + private String userPhone; + + private String enterpriseName; + + private String signMode; + + private Integer signLevel; + + private Integer type; + private String signType; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java new file mode 100644 index 0000000..96510d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java @@ -0,0 +1,108 @@ +package org.dromara.mp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 任务的报名对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task_enroll") +public class MerTaskEnroll extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java new file mode 100644 index 0000000..30ae5c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java @@ -0,0 +1,53 @@ +package org.dromara.mp.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author sunzexing + * @version 1.0 + * @title MerTaskSure + * @description 项目确认单 + * @create 2024-05-29 18:21 + */ + +@Data +public class MerTaskSure implements Serializable { + + private String proNo; + + private Integer signStatus; + + private String signUrl; + + private String sysName; + + private String taskTitle; + + private BigDecimal cost; + + private String workName; + + private String phone; + + private String cardId; + + private Long id; + + private String signNo; + + private String conPhone; + + private String conName; + + private String yyzz; + + private String conEmail; + + private String createTime; + + private String nsrSbh; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java new file mode 100644 index 0000000..3ee959d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java @@ -0,0 +1,137 @@ +package org.dromara.mp.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit_domain") +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java new file mode 100644 index 0000000..28f1952 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java @@ -0,0 +1,65 @@ +package org.dromara.mp.domain; + +/** + * @author sunzexing + * @version 1.0 + * @title Test + * @description + * @create 2024-07-09 13:42 + */ +public class Test { + + //输入GCJ经纬度 转WGS纬度 + public static double WGSLat (double lat,double lon) { + double PI = 3.14159265358979324;//圆周率 + double a = 6378245.0;//克拉索夫斯基椭球参数长半轴a + double ee = 0.00669342162296594323;//克拉索夫斯基椭球参数第一偏心率平方 + double dLat = transformLat(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * PI; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI); + return (lat - dLat); + } + + //输入GCJ经纬度 转WGS经度 + public static double WGSLon (double lat,double lon) { + double PI = 3.14159265358979324;//圆周率 + double a = 6378245.0;//克拉索夫斯基椭球参数长半轴a + double ee = 0.00669342162296594323;//克拉索夫斯基椭球参数第一偏心率平方 + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * PI; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI); + return (lon - dLon); + } + + //转换经度所需 + public static double transformLon(double x, double y) { + double PI = 3.14159265358979324;//圆周率 + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + //转换纬度所需 + public static double transformLat(double x, double y) { + double PI = 3.14159265358979324;//圆周率 + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + + public static void main(String[] args) { + + System.out.println(Test.WGSLat(39.894599,116.379443)); + System.out.println(Test.WGSLon(39.894599,116.379443)); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java new file mode 100644 index 0000000..9951ae4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java @@ -0,0 +1,89 @@ +package org.dromara.mp.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者打卡记录对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_work_checkin") +public class UserWorkCheckin extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 乐观锁 + */ + private Long revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long proId; + + /** + * 项目编码 + */ + private String proNum; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 自雇者id + */ + private Long userWorkId; + + /** + * 打开地址 + */ + private String addressInfo; + + /** + * 经度 + */ + private String longi; + + /** + * 纬度 + */ + private String lati; + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java new file mode 100644 index 0000000..366c4b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java @@ -0,0 +1,220 @@ +package org.dromara.mp.domain; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker") +public class UserWorker extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 创建时间 + */ + @TableField(exist = false) + private Date createTime; + + /** + * 更新者 + */ + @TableField(exist = false) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(exist = false) + private Date updateTime; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Integer isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + + private String bizToken; + + private Date tokenExpirDate; + + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java new file mode 100644 index 0000000..1e31570 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java @@ -0,0 +1,92 @@ +package org.dromara.mp.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 自雇者账户对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_account") +public class UserWorkerAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + private String phone; + + /** + * 结算通道 + */ + private String passage; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + private String cardType; + + + private Integer status; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java new file mode 100644 index 0000000..194f829 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java @@ -0,0 +1,57 @@ +package org.dromara.mp.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBiz + * @description + * @create 2024-05-20 18:34 + */ + +@Data +public class UserWorkerBiz implements Serializable { + + private Long id; + + private String cardId; + + + private String vPhone; + + + private String gsmc; + + + private String signUrl; + + private String viewUrl; + + + private String conPhone; + + private String yyzz; + + private String conEmail; + + + private String name; + + private String htCode; + + //联系人 + private String conName; + + private String cardPositive; + + private String cardBack; + + private Integer isCA; + + private String nsrSbh; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java new file mode 100644 index 0000000..a60eeac --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java @@ -0,0 +1,123 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.MerTaskEnroll; + +import java.util.Date; + +/** + * 任务的报名业务对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaskEnroll.class, reverseConvertGenerate = false) +public class MerTaskEnrollBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目子编号 + */ + @NotBlank(message = "项目子编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskNo; + + /** + * 任务id + */ + @NotNull(message = "任务id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long taskId; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 自雇者微信openid + */ + @NotBlank(message = "自雇者微信openid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @NotNull(message = "竞标状态(1:竞标中 2:竞标失败 3:竞标成功)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 选定审核人 + */ + @NotBlank(message = "选定审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 选定审核时间 + */ + @NotNull(message = "选定审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @NotNull(message = "完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer taskStatus; + + /** + * 验收备注 + */ + @NotBlank(message = "验收备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @NotNull(message = "结算状态(0:待结算 1:已结算)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @NotBlank(message = "任务确认书文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskConfirmFile; + + /** + * 交付内容 + */ + @NotBlank(message = "交付内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskDesc; + + /** + * 交付图片 + */ + @NotBlank(message = "交付图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskPic; + + /** + * 报名时间 + */ + @NotNull(message = "报名时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java new file mode 100644 index 0000000..64edf8d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java @@ -0,0 +1,151 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.SysUnitDomain; + +/** + * 单位域名配置业务对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnitDomain.class, reverseConvertGenerate = false) +public class SysUnitDomainBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 域名地址 + */ + @NotBlank(message = "域名地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String domainName; + + /** + * 站点名称 + */ + @NotBlank(message = "站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String websiteName; + + /** + * 客服热线 + */ + @NotBlank(message = "客服热线不能为空", groups = { AddGroup.class, EditGroup.class }) + private String hotline; + + /** + * 版权信息 + */ + @NotBlank(message = "版权信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyright; + + /** + * 备案号 + */ + @NotBlank(message = "备案号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String recordNo; + + /** + * 备案号链接地址 + */ + @NotBlank(message = "备案号链接地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @NotBlank(message = "PC登录页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @NotBlank(message = "PC登录页广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @NotBlank(message = "PC主页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String homePageLogo; + + /** + * 手机端LOGO + */ + @NotBlank(message = "手机端LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapLogo; + + /** + * 手机端广告图 + */ + @NotBlank(message = "手机端广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @NotBlank(message = "微信公众号站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String weChatPub; + + + + /** + * PC登录协议 + */ + @NotBlank(message = "PC登录协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @NotBlank(message = "手机端用户协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @NotBlank(message = "私有协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @NotNull(message = "状态(1:正常 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @NotNull(message = "主体id(结算中心id或运营商id或渠道商id或商户id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java new file mode 100644 index 0000000..0873025 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java @@ -0,0 +1,79 @@ +package org.dromara.mp.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWokerOperBo + * @description + * @create 2024-04-29 11:40 + */ + +@Data +public class UserWokerOperBo implements Serializable { + + //企业ID + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class }) + private Long merId; + + //企业编号 + @NotNull(message = "企业编号不能为空", groups = { AddGroup.class }) + private String merNo; + + //服务商编号 + @NotNull(message = "服务商编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + //服务商ID + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class }) + private Long sydId; + + //姓名 + @NotNull(message = "姓名不能为空", groups = { AddGroup.class }) + private String workName; + + //身份证 + @NotNull(message = "身份证不能为空", groups = { AddGroup.class }) + private String idCard; + + //手机号 + @NotNull(message = "手机号不能为空", groups = { AddGroup.class }) + private String phone; + + //业务类型 + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + //开户行名称 + @NotNull(message = "开户行名称不能为空", groups = { AddGroup.class }) + private String khh; + + //开户行名称 + @NotNull(message = "开户行账号不能为空", groups = { AddGroup.class }) + private String backCard; + + private String code; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //银行卡照片 + private String bankPic; + + //人脸照片 + private String facePic; + + private Long workId; + + private String channelName; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java new file mode 100644 index 0000000..2898c15 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java @@ -0,0 +1,97 @@ +package org.dromara.mp.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 自雇者打卡记录业务对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode() +@AutoMapper(target = UserWorkCheckin.class, reverseConvertGenerate = false) +public class UserWorkCheckinBo extends BaseEntity { + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + /** + * 乐观锁 + */ + private Long revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 主键id + */ + private Long id; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 项目编码 + */ + private String proNum; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 自雇者id + */ + private Long userWorkId; + + /** + * 打开地址 + */ + @NotBlank(message = "打开地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addressInfo; + + /** + * 经度 + */ + private String longi; + + /** + * 纬度 + */ + private String lati; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java new file mode 100644 index 0000000..1b79f1e --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java @@ -0,0 +1,91 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.UserWorkerAccount; + +import java.util.Date; + +/** + * 自雇者账户业务对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAccount.class, reverseConvertGenerate = false) +public class UserWorkerAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 银行卡照片 + */ + @NotBlank(message = "银行卡照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCardPic; + + /** + * 预留手机号 + */ + @NotBlank(message = "预留手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + + private String cardType; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java new file mode 100644 index 0000000..185b585 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java @@ -0,0 +1,202 @@ +package org.dromara.mp.domain.bo; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 自雇者业务对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorker.class, reverseConvertGenerate = false) +public class UserWorkerBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class}) + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class}) + private String cardId; + + /** + * 身份证正面图片 + */ + @NotBlank(message = "身份证正面图片不能为空", groups = { AddGroup.class}) + private String cardPositive; + + /** + * 身份证反面图片 + */ + @NotBlank(message = "身份证反面图片不能为空", groups = { AddGroup.class}) + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date issueDate; + + /** + * 失效日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + private String bizToken; + + private Date tokenExpirDate; + + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java new file mode 100644 index 0000000..74366b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java @@ -0,0 +1,59 @@ +package org.dromara.mp.domain.vo; + +public class BankCardOcrVo { + private String cardNo; // 银行卡号 (必返) + private String bankName; // 发卡行名称 (必返) + private String orderNo; // 流水号 (必返) + private int executeStatus; // 执行状态(0:success;1:fail) (必返) + private String resultMessage; // 返回信息 (必返) + private String validDate; // 银行卡有效期 (必返) + + // Getters and Setters + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public int getExecuteStatus() { + return executeStatus; + } + + public void setExecuteStatus(int executeStatus) { + this.executeStatus = executeStatus; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } + + public String getValidDate() { + return validDate; + } + + public void setValidDate(String validDate) { + this.validDate = validDate; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java new file mode 100644 index 0000000..9666773 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java @@ -0,0 +1,27 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BankCardVo + * @description 银行卡信息 + * @create 2024-04-02 13:38 + */ + +@Data +public class BankCardVo implements Serializable { + + private String cardNo; + + private String bankInfo; + + private String cardType; + + private String cardName; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java new file mode 100644 index 0000000..3b8bfb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java @@ -0,0 +1,113 @@ +package org.dromara.mp.domain.vo; + +public class IdCardVo { + private String address; // 户籍地住址(上传人像面时必返) + private String birthday; // 出生日期(上传人像面时必返) + private String gender; // 性别(上传人像面时必返) + private String idNo; // 身份证号码 (上传人像面时必返) + private String name; // 姓名(上传人像面时必返) + private String nation; // 民族(上传人像面时必返) + private String issuingAuthority; // 发证机关(上传国徽面时必返) + private String issuingTime; // 有效期开始时间(上传国徽面时必返) + private String overdueTime; // 有效期结束时间(上传国徽面时必返) + private String orderNo; // 流水号 (必返) + private int executeStatus; // 执行状态(0:success;1:fail) (必返) + private String resultMessage; // 结果消息 + + // Getters and Setters + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getIssuingAuthority() { + return issuingAuthority; + } + + public void setIssuingAuthority(String issuingAuthority) { + this.issuingAuthority = issuingAuthority; + } + + public String getIssuingTime() { + return issuingTime; + } + + public void setIssuingTime(String issuingTime) { + this.issuingTime = issuingTime; + } + + public String getOverdueTime() { + return overdueTime; + } + + public void setOverdueTime(String overdueTime) { + this.overdueTime = overdueTime; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public int getExecuteStatus() { + return executeStatus; + } + + public void setExecuteStatus(int executeStatus) { + this.executeStatus = executeStatus; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java new file mode 100644 index 0000000..0a1b98f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java @@ -0,0 +1,152 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.MerTaskEnroll; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaskEnroll.class) +public class MerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String no; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 任务id + */ + @ExcelProperty(value = "任务id") + private Long taskId; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 自雇者微信openid + */ + @ExcelProperty(value = "自雇者微信openid") + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @ExcelProperty(value = "竞标状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:竞标中,2=:竞标失败,3=:竞标成功") + private Long verifyStatus; + + /** + * 选定审核人 + */ + @ExcelProperty(value = "选定审核人") + private String verifyBy; + + /** + * 选定审核时间 + */ + @ExcelProperty(value = "选定审核时间") + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @ExcelProperty(value = "完工状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未完成,1=:已完成,2=:验收驳回,3=:验收通过") + private Integer taskStatus; + + /** + * 验收备注 + */ + @ExcelProperty(value = "验收备注") + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @ExcelProperty(value = "结算状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待结算,1=:已结算") + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @ExcelProperty(value = "任务确认书文件地址") + private String taskConfirmFile; + + /** + * 交付内容 + */ + @ExcelProperty(value = "交付内容") + private String taskDesc; + + /** + * 交付图片 + */ + @ExcelProperty(value = "交付图片") + private String taskPic; + + /** + * 报名时间 + */ + @ExcelProperty(value = "报名时间") + private Date addTime; + + + @ExcelProperty(value = "任务标题") + private String name; + + + private Integer signStatus; + + /*** + * 获取确认单状态 0 未确认, 1确认 + * @return + */ + public Integer getDocStatus() { + if(this.signStatus != null && this.signStatus == 1){ + return 1; + }else{ + return 0; + } + } + + private Integer docStatus; + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java new file mode 100644 index 0000000..4e6ed2d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java @@ -0,0 +1,88 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskVo + * @description + * @create 2024-05-08 18:42 + */ + +@Data +public class MyTaskVo implements Serializable { + + + //任务ID + private Long id; + + //任务标题 + private String proName; + + //佣金 + private Long yj; + + //最大佣金 + private Long maxYj; + + //行业 + private String hy; + + + //佣金 + private String yjStr; + + //项目编号 + private String no; + + + //派单类型 + private Integer proType; + + + private Date createTime; + + + //发布时间 + private String publishTime; + + + + //派单类型中文 + private String proTypeStr; + + //竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + private Integer verifyStatus; + + //完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + private Integer taskStatus; + + public String getYjStr() { + return StringUtils.fenToYuanFormatter(this.yj); + } + + + + public String getProTypeStr() { + + if(this.proType != null){ + if( 1 == proType ){ + return "派单"; + }else{ + return "抢单"; + } + }else{ + return "--"; + } + + } + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java new file mode 100644 index 0000000..099ca11 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java @@ -0,0 +1,32 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementChannelVo + * @description + * @create 2024-05-08 18:02 + */ + +@Data +public class SettlementChannelVo implements Serializable { + + private Long id; + + //通道名称 + private String channelName; + + //银行卡号 + private String bankCard; + + //银行名称 + private String bankName; + + //卡类型 + private String cardType; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java new file mode 100644 index 0000000..810b6af --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java @@ -0,0 +1,150 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.SysUnitDomain; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnitDomain.class) +public class SysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 域名地址 + */ + @ExcelProperty(value = "域名地址") + private String domainName; + + /** + * 站点名称 + */ + @ExcelProperty(value = "站点名称") + private String websiteName; + + /** + * 客服热线 + */ + @ExcelProperty(value = "客服热线") + private String hotline; + + /** + * 版权信息 + */ + @ExcelProperty(value = "版权信息") + private String copyright; + + /** + * 备案号 + */ + @ExcelProperty(value = "备案号") + private String recordNo; + + /** + * 备案号链接地址 + */ + @ExcelProperty(value = "备案号链接地址") + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @ExcelProperty(value = "PC登录页LOGO") + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @ExcelProperty(value = "PC登录页广告图") + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @ExcelProperty(value = "PC主页LOGO") + private String homePageLogo; + + /** + * 手机端LOGO + */ + @ExcelProperty(value = "手机端LOGO") + private String wapLogo; + + /** + * 手机端广告图 + */ + @ExcelProperty(value = "手机端广告图") + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @ExcelProperty(value = "微信公众号站点名称") + private String weChatPub; + + + /** + * PC登录协议 + */ + @ExcelProperty(value = "PC登录协议") + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @ExcelProperty(value = "手机端用户协议") + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @ExcelProperty(value = "私有协议") + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:禁用") + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)") + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @ExcelProperty(value = "主体id(结算中心id或运营商id或渠道商id或商户id)") + private Long busId; + + + private String mpDomainHashCode; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java new file mode 100644 index 0000000..3659506 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java @@ -0,0 +1,89 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title TaskVo + * @description + * @create 2024-05-09 14:06 + */ +@Data +public class TaskVo implements Serializable { + + + private Long id; + + private Long taskId; + + private String proName; + + private String no; + + private Long yj; + + private Long maxYj; + + private Integer classify; + + public String getyJStr() { + if(classify != null){ + if(classify == 1){ + return StringUtils.fenToYuanFormatter(this.yj)+" ~ "+StringUtils.fenToYuanFormatter(this.maxYj); + }else{ + return StringUtils.fenToYuanFormatter(this.yj); + } + + }else{ + return ""; + } + + } + private String yjStr; + + private String hy; + + private Date createTime; + + private String proContent; + + public String getMerName() { + return StringUtils.merNameHide(this.merName); + } + + private String merName; + + private Date merCreateTime; + + private Integer merIsAuth; + + private Integer verifyStatus; + + private String taskDesc; + + private String taskPic; + + private String taskRemark; + + private String taskConfirmFile; + + private Integer taskStatus; + + + + + + //签到信息 + private List checkInVolist = new ArrayList<>(); + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java new file mode 100644 index 0000000..2d982d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java @@ -0,0 +1,106 @@ +package org.dromara.mp.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.mp.domain.UserWorkCheckin; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者打卡记录视图对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkCheckin.class) +public class UserWorkCheckinVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 乐观锁 + */ + @ExcelProperty(value = "乐观锁") + private Long revision; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdTime; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updatedBy; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 项目id + */ + @ExcelProperty(value = "项目id") + private Long proId; + + /** + * 项目编码 + */ + @ExcelProperty(value = "项目编码") + private String proNum; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updatedTime; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long userWorkId; + + /** + * 打开地址 + */ + @ExcelProperty(value = "打开地址") + private String addressInfo; + + /** + * 经度 + */ + @ExcelProperty(value = "经度") + private String longi; + + /** + * 纬度 + */ + @ExcelProperty(value = "纬度") + private String lati; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java new file mode 100644 index 0000000..7297063 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java @@ -0,0 +1,112 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.UserWorkerAccount; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 自雇者账户视图对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAccount.class) +public class UserWorkerAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 银行卡照片 + */ + @ExcelProperty(value = "银行卡照片") + private String bankCardPic; + + + /** + * 预留手机号 + */ + @ExcelProperty(value = "预留手机号") + private String phone; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + private String cardType; + + //用工姓名 + private String name; + + private Integer status; + + public String getPhone() { + return this.phone; +// if(StringUtils.isNotEmpty(this.phone)){ +// return StringUtils.phoneHide(this.phone); +// }else{ +// return "--"; +// } + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java new file mode 100644 index 0000000..21a7574 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java @@ -0,0 +1,31 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBus + * @description + * @create 2024-05-10 18:32 + */ +@Data +public class UserWorkerBus implements Serializable { + + private Long id; + + private String signSub; + + private String htNo; + + private Integer signStatus; + + private String webUrl; + + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java new file mode 100644 index 0000000..202ac8b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java @@ -0,0 +1,243 @@ +package org.dromara.mp.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.mp.domain.UserWorker; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorker.class) +public class UserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 微信openid + */ + @ExcelProperty(value = "微信openid") + private String openId; + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String name; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @ExcelProperty(value = "银行卡是否认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuthentication; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 身份证正面图片 + */ + @ExcelProperty(value = "身份证正面图片") + private String cardPositive; + + /** + * 身份证反面图片 + */ + @ExcelProperty(value = "身份证反面图片") + private String cardBack; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + @ExcelProperty(value = "是否实名认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @ExcelProperty(value = "是否签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isSign; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @ExcelProperty(value = "是否临时税务登记", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isRegister; + + /** + * 人脸照片 + */ + @ExcelProperty(value = "人脸照片") + private String photoPath; + + /** + * 性别 + */ + @ExcelProperty(value = "性别") + private String sex; + + /** + * 标签 + */ + @ExcelProperty(value = "标签") + private String tag; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String userArea; + + /** + * 区域名称 + */ + @ExcelProperty(value = "区域名称") + private String userAreaName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 民族 + */ + @ExcelProperty(value = "民族") + private String nation; + + /** + * 户籍地址 + */ + @ExcelProperty(value = "户籍地址") + private String address; + + /** + * 出生日期 + */ + @ExcelProperty(value = "出生日期") + private Date birthday; + + /** + * 签发机关 + */ + @ExcelProperty(value = "签发机关") + private String issue; + + /** + * 签发日期 + */ + @ExcelProperty(value = "签发日期") + private Date issueDate; + + /** + * 失效日期 + */ + @ExcelProperty(value = "失效日期") + private String expiryDate; + + /** + * 推荐人 + */ + @ExcelProperty(value = "推荐人") + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:启用,2=:禁用") + private Integer status; + + + @ExcelIgnore + private String bizToken; + + @ExcelIgnore + private Date tokenExpirDate; + + @ExcelIgnore + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java new file mode 100644 index 0000000..dc92b26 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java @@ -0,0 +1,83 @@ +package org.dromara.mp.dubbo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.map.api.RemoteUserWokerService; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.IUserWorkerService; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerServiceImpl + * @description + * @create 2024-03-29 10:57 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserWorkerServiceImpl implements RemoteUserWokerService { + + + @Resource + private IUserWorkerService userWorkerService; + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @Override + public LoginMpUser selectUserWorkByPhonenumer(String phonenumber, String tenantId) { + return TenantHelper.dynamic(phonenumber,()->{ + UserWorker userWorker = userWorkerMapper.selectOne(new LambdaQueryWrapper() + .select(UserWorker::getPhone, UserWorker::getId,UserWorker::getStatus) + .eq(UserWorker::getPhone, phonenumber)); + if (ObjectUtil.isNotNull(userWorker)) { + if (userWorker.getStatus() == 2) { + throw new UserException("user.blocked", phonenumber); + } + LoginMpUser userWorkVo = getLoginMpUser(userWorker); + return userWorkVo; + }else{ + UserWorker uw = new UserWorker(); + uw.setPhone(phonenumber); + uw.setIsAuth(0); + uw.setStatus(1); + uw.setAddTime(DateUtil.date().toJdkDate()); + this.userWorkerMapper.insert(uw); + LoginMpUser userWorkVo = getLoginMpUser(uw); + +// LoginMpUser userWorkVo = new LoginMpUser(); +// userWorkVo.setUserId(IdUtil.getSnowflakeNextId()); + return userWorkVo; + } + }); + + } + + @NotNull + private LoginMpUser getLoginMpUser(UserWorker userWorker) { + LoginMpUser userWorkVo = new LoginMpUser(); + userWorkVo.setUserId(userWorker.getId()); + userWorkVo.setPhone(userWorker.getPhone()); + userWorkVo.setName(userWorker.getName()); +// userWorkVo.setIsAuth(userWorker.getIsAuth()); + return userWorkVo; + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java new file mode 100644 index 0000000..5e74ea9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java @@ -0,0 +1,18 @@ +package org.dromara.mp.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title BankCard4 + * @description + * @create 2024-04-02 13:56 + */ +public class BankCard4Exception extends BaseException { + + public BankCard4Exception(String msg){ + super(msg); + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java new file mode 100644 index 0000000..271d919 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java @@ -0,0 +1,17 @@ +package org.dromara.mp.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title MpException + * @description + * @create 2024-04-07 15:37 + */ +public class MpException extends BaseException { + + public MpException(String msg){ + super(msg); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java new file mode 100644 index 0000000..7e2aff3 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java @@ -0,0 +1,16 @@ +package org.dromara.mp.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; + +/** + * 任务的报名Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskEnrollMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java new file mode 100644 index 0000000..61c35a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java @@ -0,0 +1,116 @@ +package org.dromara.mp.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.mp.domain.MerTaskSure; +import org.dromara.mp.domain.UserWorkerBiz; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskMapper + * @description 我的任务接口 + * @create 2024-05-08 18:43 + */ +public interface MyTaskMapper { + + + /*** + * 任务广场查询 + * @param name + * @param workId + * @param page + * @return + */ + Page selTastList(@Param("name") String name,@Param("workId") Long workId, @Param("page") IPage page); + + + /**** + * 任务广场- 任务详情 + * @param id + * @return + */ + TaskVo selTaskListDetail(Long id); + + + /*** + * 我的任务 + * @param name + * @param workId + * @param page + * @return + */ + Page selectMyTaskList(@Param("name") String name,@Param("workId") Long workId, @Param("page") IPage page); + + + /*** + * 签到 查询项目 + * @param workId + * @return + */ + List selMyCheckPro(Long workId); + + + TaskVo selMyTaskDetail(@Param("id") Long id,@Param("workId") Long workId); + + + /*** + * 个人签约查询 + * @param workId + * @param page + * @return + */ + Page selHtListByWorkId(@Param("workId") Long workId, @Param("page") IPage page); + + + /**** + * 项目确认单查询 + * @param workId + * @param page + * @return + */ + Page selProSureDoc(@Param("workId") Long workId, @Param("page") IPage page); + + + /*** + * 获取合同信息 + * @param id + * @return + */ + UserWorkerBiz selectHtInfoByUwbId(Long id); + + + int updateUserWorkerHtInfoByBizId(UserWorkerBiz uwbiz); + + + /**** + * 项目确认单 + * @param id + * @return + */ + MerTaskSure selectTaskSure(Long id); + + + /*** + * 更新项目确认单 + * @param mts + * @return + */ + int updateTaskSure(MerTaskSure mts); + + + /** + * 更新CA状态 + */ + void updateCAStatus(String name); +} + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java new file mode 100644 index 0000000..95e315d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位域名配置Mapper接口 + * + * @author LionLi + * @date 2024-04-07 + */ +public interface SysUnitDomainMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java new file mode 100644 index 0000000..812cecc --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 自雇者打卡记录Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface UserWorkCheckinMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java new file mode 100644 index 0000000..204a4d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java @@ -0,0 +1,27 @@ +package org.dromara.mp.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWokerOperBo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; + +import java.util.List; + + +/** + * 自雇者账户Mapper接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface UserWorkerAccountMapper extends BaseMapperPlus { + + + /*** + * 根据用工id,通道,银行卡号查询银行卡信息 + * @param bo + * @return + */ + public List selctBankInfoByUidChannelBankNo(UserWokerOperBo bo); + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java new file mode 100644 index 0000000..ab04165 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 自雇者Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface UserWorkerMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java new file mode 100644 index 0000000..c67ec61 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java @@ -0,0 +1,111 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ICardIdService + * @description 身份证信息 + * @create 2024-04-01 17:32 + */ +public interface ICardIdService { + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:24 + * 说明: + **/ + + public Map idCardOcr(MultipartFile file, String type, String code) throws Exception; + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 11:15 + * 说明: + **/ + + public Map bankUploadOcr(@RequestPart("file") MultipartFile file, String type, String code )throws Exception; + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:20 + * 说明: 身份认证结果,成功-生成人身核验连接 + **/ + Map submitIdCardInfo(UserWorkerBo userWorkerBo,String code) throws Exception; + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-17 14:57 + * 说明:银行卡3要素认证 + **/ + + public Map bankAuth4(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName)throws Exception; + + + /*** + * 修改银行卡信息 + * @param cardNo + * @param code + * @param bankImg + * @param bankInfo + * @param cardType + * @param cardName + * @param phone + * @param id + * @return + */ + public Boolean mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id)throws Exception; + + /*** + * 获取用户信息 + * @return + */ + Map getUserInfo(); + + + /*** + * 获取人身核验地址 + * @param code + * @return + */ + Map getFaceAuth(String code)throws Exception; + + + /**** + * 获取人脸核验的结果 + * @param bizToken + * @param code 唯一码 + * @return + */ + String getFaceAuthResult(String bizToken,String code)throws Exception; + + + + Map getUserCardInfo(); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java new file mode 100644 index 0000000..9c84aa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java @@ -0,0 +1,131 @@ +package org.dromara.mp.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title IMyTaskService + * @description + * @create 2024-05-08 18:44 + */ +public interface IMyTaskService { + + + /*** + * 查询任务广场 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selTastList(String name, PageQuery pageQuery); + + + /*** + * 查询我的任务广场 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selMyTastList(String name, PageQuery pageQuery); + + + + /*** + * 任务广场-任务详情 + * @param id + * @return + */ + TaskVo selTaskListDetail(Long id); + + + /*** + * 接受任务 + * @param id 任务ID + * @param no 任务编码 + * @return + */ + Boolean acceptTask(Long id,String no); + + + List selMyCheckPro(); + + + TaskVo selMyTaskDetail(Long id); + + + /*** + * 上传完工报告 + * @param enroll + * @return + */ + int updOverReport(MerTaskEnroll enroll); + + + /*** + * 查询完工报告 + * @param id + * @return + */ + MerTaskEnrollVo selOverReport(Long id); + + + + TableDataInfo selMyHtList(String name, PageQuery pageQuery); + + + /*** + * 查询我的项目确认单 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selProSureDoc(String name, PageQuery pageQuery); + + + /*** + * 签到 + * @param id + * @param domain + * @return + * @throws Exception + */ + String signPro(Long id,String domain)throws Exception; + + /*** + * 签到 + * @param id + * @param domain + * @return + * @throws Exception + */ + String signProJzq(Long id,String domain)throws Exception; + + + + /*** + * 项目确认单连接 + * @param id + * @param domain + * @return + * @throws Exception + */ + public String signSurePro(Long id,String domain)throws Exception; + + /*** + * 项目确认单连接 + * @param id + * @param domain + * @return + * @throws Exception + */ + public String signSureProJzq(Long id,String domain)throws Exception; +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java new file mode 100644 index 0000000..3b27ec5 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java @@ -0,0 +1,53 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.vo.SettlementChannelVo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title ISettlementAccountService + * @description 个人中心-结算账户 + * @create 2024-05-08 14:10 + */ +public interface ISettlementAccountService { + + + /*** + * 获取结算渠道 + * @return + */ + List getSettleChannel(); + + /*** + * 获取银行列表 + * @param bankName + * @return + */ + List getBankList(String bankName); + + + /**** + * 添加结算账户 + * @param bankType + * @param name + * @param bankCard + * @param channelName + * @param phone + * @param bankPic + * @return + */ + int addAccount(String bankType, String name, String bankCard,String channelName,String phone, + String bankPic,String cardType); + + + /**** + * 获取银行卡详情 + * @param id + * @return + */ + UserWorkerAccountVo getBankDetail(Long id); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java new file mode 100644 index 0000000..1abf1bb --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java @@ -0,0 +1,99 @@ +package org.dromara.mp.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.bo.SysUnitDomainBo; +import org.dromara.mp.domain.vo.SysUnitDomainVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 单位域名配置Service接口 + * + * @author LionLi + * @date 2024-04-07 + */ +public interface ISysUnitDomainService { + + /** + * 查询单位域名配置 + */ + SysUnitDomainVo queryById(Long id); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 15:11 + * 说明:根据域名查询配置信息 + **/ + SysUnitDomainVo queryByMpDomain(String mpDomain); + + +// +// /** +// * @Param +// * @Return +// * @Author sunzexing +// * @Date 2024-04-07 16:35 +// * 说明:获取短信配置 +// **/ +// +// Map selSmsConfig(String domainCode); + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:35 + * 说明:获取短信配置 + **/ + + SysUnitDomain selSmsConfig(String domainCode); + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:36 + * 说明: 获取人脸核验,ocr等配置 + **/ + Map mpOtherThirdConfig(String domainCode); + + + + boolean sendSms(String phone,String domainCode); + + /** + * 查询单位域名配置列表 + */ + TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery); + + /** + * 查询单位域名配置列表 + */ + List queryList(SysUnitDomainBo bo); + + /** + * 新增单位域名配置 + */ + Boolean insertByBo(SysUnitDomainBo bo); + + /** + * 修改单位域名配置 + */ + Boolean updateByBo(SysUnitDomainBo bo); + + /** + * 校验并批量删除单位域名配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java new file mode 100644 index 0000000..0dcb75d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java @@ -0,0 +1,49 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者打卡记录Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IUserWorkCheckinService { + + /** + * 查询自雇者打卡记录 + */ + UserWorkCheckinVo queryById(Long id); + + /** + * 查询自雇者打卡记录列表 + */ + TableDataInfo queryPageList(UserWorkCheckinBo bo, PageQuery pageQuery); + + /** + * 查询自雇者打卡记录列表 + */ + List queryList(UserWorkCheckinBo bo); + + /** + * 新增自雇者打卡记录 + */ + Boolean insertByBo(UserWorkCheckinBo bo); + + /** + * 修改自雇者打卡记录 + */ + Boolean updateByBo(UserWorkCheckinBo bo); + + /** + * 校验并批量删除自雇者打卡记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java new file mode 100644 index 0000000..8f47f2a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java @@ -0,0 +1,53 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 自雇者Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IUserWorkerService { + + /** + * 查询自雇者 + */ + UserWorkerVo queryById(Long id); + + /** + * 查询自雇者列表 + */ + TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery); + + + + + /** + * 查询自雇者列表 + */ + List queryList(UserWorkerBo bo); + + /** + * 新增自雇者 + */ + Boolean insertByBo(UserWorkerBo bo); + + /** + * 修改自雇者 + */ + Boolean updateByBo(UserWorkerBo bo); + + /** + * 校验并批量删除自雇者信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java new file mode 100644 index 0000000..49234f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java @@ -0,0 +1,986 @@ +package org.dromara.mp.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.lang.UUID; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ibm.icu.text.SimpleDateFormat; +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.faceid.v20180301.FaceidClient; +import com.tencentcloudapi.faceid.v20180301.models.*; +import com.tencentcloudapi.ocr.v20181119.OcrClient; +import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRRequest; +import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRResponse; +import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest; +import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.*; +import org.dromara.mp.exception.BankCard4Exception; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.UserWorkerAccountMapper; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.ICardIdService; +import org.dromara.mp.service.ISettlementAccountService; +import org.dromara.mp.service.ISysUnitDomainService; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.*; +import java.text.ParseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title CardIdService + * @description 身份信息 + * @create 2024-04-01 17:34 + */ +@Service +@Slf4j +public class CardIdServiceImpl extends BaseService implements ICardIdService { + + + @Resource + public ISysUnitDomainService unitDomainService; + + @Resource + public IUserWorkerService userWorkerService; + + @DubboReference + public RemoteFileService remoteFileService; + + + @DubboReference + public RemoteClientService remoteClientService; + + @DubboReference + public RemoteJzqService remoteJzqService; + + @Resource + public ISettlementAccountService settlementAccountService; + + + @Resource + public UserWorkerAccountMapper userWorkerAccountMapper; + + + @Resource + public UserWorkerMapper userWorkerMapper; + + + public static final long MAXSIZE = 1024*1024*5; + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 14:13 + * 说明:银行卡4要素认证 + **/ + + @Override + public Map bankAuth4(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName)throws Exception{ + Map result = new HashMap(); + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("银行预留手机号不能为空"); + } + + if(StringUtils.isEmpty(bankInfo)){ + this.invalidationParamsException("银行信息不能为空"); + } + + if(StringUtils.isEmpty(cardNo)){ + this.invalidationParamsException("银行卡号不能为空"); + } + Long userId = MpLoginHelper.getUserId(); + UserWorkerVo userWorker = this.userWorkerService.queryById(userId); + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + boolean tag = this.bankCard3(cardNo,userWorker.getName(),userWorker.getCardId()); + if(tag){ + int i = this.settlementAccountService.addAccount(bankInfo,userWorker.getName(),cardNo,channelName,phone,bankImg,cardType); + if( i <= 0){ + this.invalidationParamsException("添加银行卡失败!"); + } + } + + UserWorkerBo bo = new UserWorkerBo(); + bo.setId(userWorker.getId()); + bo.setIsAuthentication(1L); + bo.setUpdateTime(new Date()); + this.userWorkerService.updateByBo(bo); + result.put("resultTag",tag); + return result; + } + + + + + @Override + @Transactional + public Boolean mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id)throws Exception { + + if(id == null){ + this.invalidationParamsException("银行卡ID不能为空"); + } + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("银行预留手机号不能为空"); + } + + if(StringUtils.isEmpty(bankInfo)){ + this.invalidationParamsException("银行信息不能为空"); + } + + if(StringUtils.isEmpty(cardNo)){ + this.invalidationParamsException("银行卡号不能为空"); + } + + Long userId = MpLoginHelper.getUserId(); + UserWorkerVo userWorker = this.userWorkerService.queryById(userId); + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + boolean tag = this.bankCard3(cardNo,userWorker.getName(),userWorker.getCardId()); + + + UserWorkerAccountVo uwav = this.userWorkerAccountMapper.selectVoById(id); + + if(uwav != null && uwav.getBankCard().equals(cardNo) &&uwav.getBankType().equals(bankInfo)){ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setId(id); + userWorkerAccount.setBankCardPic(bankImg); + userWorkerAccount.setBankType(bankInfo); + userWorkerAccount.setUpdateBy(MpLoginHelper.getUserId()); + userWorkerAccount.setUpdateTime(new Date()); + userWorkerAccount.setCardType(cardType); + userWorkerAccount.setPhone(phone); + this.userWorkerAccountMapper.updateById(userWorkerAccount); + + }else{ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setId(id); + userWorkerAccount.setIsDefault(0L); + userWorkerAccount.setStatus(0); + this.userWorkerAccountMapper.updateById(userWorkerAccount); + int i = this.settlementAccountService.addAccount(bankInfo,userWorker.getName(),cardNo,uwav.getPassage(),phone,bankImg,cardType); + if( i <= 0){ + this.invalidationParamsException("修改银行卡失败!"); + } + + } + + return true; + } + + @Override + public Map getUserInfo() { + Map paraMap = new HashMap(); + UserWorkerVo vo = this.userWorkerService.queryById(MpLoginHelper.getUserId()); + paraMap.put("name",vo.getName()); + paraMap.put("phone",vo.getPhone()); + paraMap.put("isAuth",vo.getIsAuth()); + paraMap.put("isAuthentication",vo.getIsAuthentication()); + paraMap.put("isFaceAuth",vo.getIsFaceAuth()); + return paraMap; + } + + + /*** + * 身份证识别 + * @param file + * @param type + * @param code + * @return + * @throws Exception + */ + + public Map idCardOcr(MultipartFile file, String type,String code) throws Exception{ + + Map resultMap = new HashMap(); + + try{ + String imagestr = null; + if(file.getSize() > MAXSIZE){ + imagestr = org.dromara.mp.util.ImgUtil.scaleImgToBase64(file.getInputStream(),0.8f); + }else{ + imagestr = Base64.encode(file.getInputStream()); + } + if(StringUtils.isEmpty(imagestr)){ + invalidationParamsException("base64编码出错"); + } +// ThirdConf thirdConf = this.getThirdConfig(code,"idcardConfig"); +// LoginMpUser userWorkerVo = MpLoginHelper.getLoginUser(); +// UserWorkerVo resultWorkerVo = this.cardIdOcr(userWorkerVo.getPhone(),imagestr,thirdConf,type); + + + String resultFile; + + if (type.equals("FRONT")){ + resultFile = remoteJzqService.ocrIdentity(imagestr,1); + JSONObject jsonObject = JSONObject.parseObject(resultFile); + if (jsonObject.getString("success").equals("false")){ + this.invalidationParamsException("身份证正面识别失败"); + } + JSONObject data = jsonObject.getJSONObject("data"); + IdCardVo idCardVo = data.toJavaObject(IdCardVo.class); + String birthday = convertDateFormat(idCardVo.getBirthday()); + LocalDate localDate = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); + + resultMap.put("name", idCardVo.getName()); + resultMap.put("cardId", idCardVo.getIdNo()); + resultMap.put("address", idCardVo.getAddress()); + resultMap.put("birthday", sqlDate); + resultMap.put("sex", idCardVo.getGender()); + resultMap.put("nation", idCardVo.getNation()); + }else { + resultFile = remoteJzqService.ocrIdentity(imagestr,0); + JSONObject jsonObject = JSONObject.parseObject(resultFile); + if(jsonObject.getString("success").equals("false")){ + this.invalidationParamsException("身份证反面识别失败"); + } + JSONObject data = jsonObject.getJSONObject("data"); + IdCardVo idCardVo = data.toJavaObject(IdCardVo.class); + String issueDate = convertDateFormat(idCardVo.getIssuingTime()); + String expiryDate = convertDateFormat(idCardVo.getOverdueTime()); + LocalDate localDate = LocalDate.parse(issueDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + LocalDate localDate1 = LocalDate.parse(expiryDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + resultMap.put("issue", idCardVo.getIssuingAuthority()); + resultMap.put("issueDate", localDate); + resultMap.put("expiryDate", localDate1); + + } + + String originalFilename = file.getOriginalFilename(); + String contentType = file.getContentType(); + RemoteFile remoteFile = remoteFileService.upload(UUID.fastUUID().toString(),originalFilename,contentType,file.getBytes()); + + resultMap.put("cardImg",remoteFile.getUrl()); + resultMap.put("ossId",remoteFile.getOssId()); + }catch (Exception e){ + e.printStackTrace(); + log.error("身份证识别报错===>"+e.getMessage()); + throw e; + } + return resultMap; + } + + private String convertDateFormat(String dateStr) { + if (dateStr == null || dateStr.length() != 8) { + throw new IllegalArgumentException("日期格式不正确,应为 yyyyMMdd"); + } + return dateStr.substring(0, 4) + "-" + dateStr.substring(4, 6) + "-" + dateStr.substring(6, 8); + } + + /*** + * 银行卡图片识别 + * @param file + * @param type + * @param code + * @return + * @throws Exception + */ + @Override + public Map bankUploadOcr(MultipartFile file, String type, String code) throws Exception { + + Map resultMap = new HashMap(); +// String imagestr = null; +// if(file.getSize() > MAXSIZE){ +// imagestr = org.dromara.mp.util.ImgUtil.scaleImgToBase64(file.getInputStream(),0.8f); +// }else{ +// imagestr = Base64.encode(file.getInputStream()); +// } +// +// if(StringUtils.isEmpty(imagestr)){ +// invalidationParamsException("base64编码出错"); +// } + + File file1 = new File(file.getOriginalFilename()); + try (FileOutputStream fos = new FileOutputStream(file1)) { + fos.write(file.getBytes()); // 将字节流写入文件 + } + +// ThirdConf thirdConf = this.getThirdConfig(code,"bankCardOcrConfig"); +// +// BankCardVo bankCardVo = this.bankCardOcr(null,imagestr,thirdConf); + + String result = remoteJzqService.ocrBank(file1); + JSONObject jsonObject = JSONObject.parseObject(result); + JSONObject data = jsonObject.getJSONObject("data"); + BankCardOcrVo bankCardVo = data.toJavaObject(BankCardOcrVo.class); + + + String originalFilename = file.getOriginalFilename(); + String contentType = file.getContentType(); + RemoteFile remoteFile = remoteFileService.upload(UUID.fastUUID().toString(),originalFilename,contentType,file.getBytes()); + + resultMap.put("cardName",bankCardVo.getBankName()); + resultMap.put("cardNo",bankCardVo.getCardNo()); +// resultMap.put("bankInfo",bankCardVo.getBankInfo().replaceAll("[\\d()]","")); + resultMap.put("validDate",bankCardVo.getValidDate()); +// resultMap.put("cardType",bankCardVo.getCardType()); + resultMap.put("orderNo",bankCardVo.getOrderNo()); + resultMap.put("bankImg",remoteFile.getUrl()); + resultMap.put("ossId",remoteFile.getOssId()); + + return resultMap; + } + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:28 + * 说明: + **/ + @Override + @Transactional + public Map submitIdCardInfo(UserWorkerBo userWorkerBo,String code)throws Exception { + + Map resultMap = new HashMap(); + + if(StringUtils.isEmpty(code)){ + throw new MpException("唯一码不能为空"); + } + + if(isIDCardExpired(userWorkerBo.getExpiryDate())){ + throw new MpException("身份证已过期"); + } + + + ThirdConf thirdConf = this.getThirdConfig(code,"idcardAuthConfig"); + //身份证二要素 + // boolean tag = this.cardId2(userWorkerBo.getName(), userWorkerBo.getCardId(),thirdConf); + String s = remoteJzqService.userValid(userWorkerBo.getName(), userWorkerBo.getCardId()); + JSONObject json = JSONObject.parseObject(s); + JSONObject data = json.getJSONObject("data"); + if(data.get("valid").equals("false")){ + throw new MpException(data.getString("message")); + } + + //更新数据 + long userId = MpLoginHelper.getUserId(); + UserWorkerVo uwv = this.userWorkerService.queryById(userId); + if(uwv == null){ + throw new MpException("非法用户"); + } + if(StringUtils.isNotEmpty(uwv.getCardId())){ + if(!uwv.getCardId().equals(userWorkerBo.getCardId())){ + throw new MpException("登录账号身份证不一致"); + } + } + UserWorkerBo paramBo = new UserWorkerBo(); + paramBo.setCardId(userWorkerBo.getCardId()); + List selList = this.userWorkerService.queryList(paramBo); + if(selList != null && !selList.isEmpty()){ + int size = selList.size(); + if(size > 1){ + throw new MpException("身份证已绑定"); + }else{ + UserWorkerVo vo = selList.get(0); + if(StringUtils.isEmpty(vo.getPhone())){ + //更新手机号 + vo.setPhone(uwv.getPhone()); + List delList = new ArrayList(); + delList.add(userId); + boolean delTag = this.userWorkerService.deleteWithValidByIds(delList,true); + if(delTag){ + UserWorkerBo upUserBo = new UserWorkerBo(); + upUserBo.setId(vo.getId()); + upUserBo.setPhone(uwv.getPhone()); + upUserBo.setStatus(1); + upUserBo.setUpdateTime(new Date()); + this.userWorkerService.updateByBo(upUserBo); + //更新缓存信息 + LoginMpUser loginMpUser = new LoginMpUser(); + loginMpUser.setUserId(vo.getId()); + loginMpUser.setPhone(vo.getPhone()); + loginMpUser.setName(vo.getName()); + String clientId = MpLoginHelper.getExtra(MpLoginHelper.CLIENT_KEY).toString(); + RemoteClientVo client = remoteClientService.queryByClientId(clientId); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(MpLoginHelper.CLIENT_KEY, client.getClientId()); + MpLoginHelper.login(loginMpUser,null, model); + Map tokenMap = new HashMap(); + tokenMap.put("access_token",StpUtil.getTokenValue()); + tokenMap.put("refresh_token",StpUtil.getTokenValue()); + resultMap.put("token",tokenMap); + userId = vo.getId(); +// MpLoginHelper.setLoginInfo(loginMpUser); + } + + }else if(!vo.getId().equals(userId)){ + throw new MpException("身份证已绑定"); + } + } + } + + + thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + Date currentDate = new Date(); +// FaceAuth faceAuth = this.faceAuth(thirdConf.getRuleId(), thirdConf.getRedirectUrl(),userWorkerBo.getName(), userWorkerBo.getCardId(),thirdConf); +// resultMap.put("redirectUrl",faceAuth.getRedirectUrl()); + + + + String orderNo = "XZS1974"; + String s1 = remoteJzqService.startH5Face(orderNo, userWorkerBo.getName(), userWorkerBo.getCardId(), thirdConf.getRedirectUrl(), 1); + JSONObject result = JSONObject.parseObject(s1); + if(result.getString("success").equals("false")){ + log.error(result.getString("msg")); + throw new MpException(result.getString("msg")); + } + JSONObject result1 = result.getJSONObject("data"); + + resultMap.put("redirectUrl", result1.getString("startFaceUrl")); + + userWorkerBo.setId(userId); + userWorkerBo.setBizToken("81EEF6178-28EE-4759-A823E-6CBBBE6BC442"); + userWorkerBo.setTokenExpirDate(DateUtil.offsetSecond(currentDate,7200)); + userWorkerBo.setIsAuth(1L); + userWorkerBo.setEditTime(currentDate); + userWorkerBo.setIsFaceAuth(1); + this.userWorkerService.updateByBo(userWorkerBo); + //人脸核验url + return resultMap; + + } + + + @Override + public Map getFaceAuth(String code)throws Exception{ + + if(StringUtils.isEmpty(code)){ + this.invalidationParamsException("唯一码不能为空"); + } + + UserWorkerVo uwv = this.userWorkerService.queryById(MpLoginHelper.getUserId()); + + if(uwv == null || uwv.getIsAuth() == null || uwv.getIsAuth().intValue() != 1){ + this.invalidationParamsException("未完成实名认证"); + } + Map resultMap = new HashMap(); + + + + ThirdConf thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + String orderNo = "XZS9740"; + + String s1 = remoteJzqService.startH5Face(orderNo, uwv.getName(), uwv.getCardId(), thirdConf.getRedirectUrl(), 1); + JSONObject result = JSONObject.parseObject(s1); + if(result.getString("success").equals("false")){ + log.error(result.getString("msg")); + throw new MpException(result.getString("msg")); + } + JSONObject result1 = result.getJSONObject("data"); + + resultMap.put("redirectUrl", result1.getString("startFaceUrl")); + +// FaceAuth faceAuth = this.faceAuth(thirdConf.getRuleId(), thirdConf.getRedirectUrl(),uwv.getName(), uwv.getCardId(),thirdConf); +// resultMap.put("redirectUrl",faceAuth.getRedirectUrl()); + Date currentDate = new Date(); + UserWorkerBo userWorkerBo = new UserWorkerBo(); + userWorkerBo.setId(MpLoginHelper.getUserId()); + userWorkerBo.setBizToken("81EEF6178-28EE-4759-A823E-6CBBBE6BC442"); + userWorkerBo.setTokenExpirDate(DateUtil.offsetSecond(currentDate,7200)); + userWorkerBo.setEditTime(currentDate); + this.userWorkerService.updateByBo(userWorkerBo); + return resultMap; + } + + + /**** + * 获取人审核的结果 + * @param bizToken + * @param code 唯一码 + * @return + * @throws Exception + */ + @Override + public String getFaceAuthResult(String bizToken,String code)throws Exception { + + if(StringUtils.isEmpty(bizToken)){ + this.invalidationParamsException("人脸核验token不能为空!"); + } + ThirdConf thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("biz_token",bizToken); + UserWorker uw = this.userWorkerMapper.selectOne(wrapper); + if(uw == null){ + return ""; + } + + RemoteFile remoteFile = this.getDectInfo(null,bizToken,thirdConf); + if(remoteFile != null && StringUtils.isNotEmpty(remoteFile.getUrl())){ + UserWorker uwk = new UserWorker(); + uwk.setId(uw.getId()); + uwk.setIsFaceAuth(1); + uwk.setPhotoPath(remoteFile.getUrl()); + uwk.setUpdateTime(new Date()); + this.userWorkerMapper.updateById(uwk); + } + return "1"; + } + + @Override + public Map getUserCardInfo() { + UserWorkerVo uwv = this.userWorkerMapper.selectVoById(MpLoginHelper.getUserId()); + Map resultMap = new HashMap(); + + resultMap.put("name",uwv.getName()); + resultMap.put("cardId",uwv.getCardId()); + resultMap.put("cardPositive",uwv.getCardPositive()); + resultMap.put("cardBack",uwv.getCardBack()); + resultMap.put("is_auth",uwv.getIsAuth()); + return resultMap; + } + + + public static boolean isIDCardExpired(String endDateStr) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date endDate; + try { + + if(endDateStr.contains("长期")){ + return false; + } + endDate = sdf.parse(endDateStr); + Date currentDate = new Date(); // 获取当前日期 + // 比较当前日期和身份证有效期结束日期 + if (currentDate.after(endDate)) { + return true; // 当前日期在有效期之后,身份证已过期 + } else { + return false; // 当前日期在有效期内,身份证未过期 + } + } catch (ParseException e) { + e.printStackTrace(); + return false; // 如果无法解析有效期结束日期,则默认返回未过期 + } + } + + private ThirdConf getThirdConfig(String code,String type ){ + + Map configMap = this.unitDomainService.mpOtherThirdConfig(code); + if(configMap == null){ + throw new MpException("第三方参数未配置!"); + } + Map subMap = (Map) configMap.get(type); + ThirdConf thirdConf = JsonUtils.parseObject(JsonUtils.toJsonString(subMap),ThirdConf.class); + + return thirdConf; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 9:25 + * 说明:身份证二要素认证 + **/ + private boolean cardId2(String name,String idCard,ThirdConf config) throws Exception{ + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IdCardVerificationRequest req = new IdCardVerificationRequest(); + + req.setName(name); + req.setIdCard(idCard); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IdCardVerificationResponse resp = client.IdCardVerification(req); + log.info("身份证二要素识姓名:["+name+"],idcard["+idCard+"]别返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new MpException(resp.getDescription()); + } + }catch(TencentCloudSDKException e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + }catch (Exception e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + } + } + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:36 + * 说明: + **/ + private UserWorkerVo cardIdOcr(String phone,String base64ImgStr,ThirdConf config,String cardType)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + OcrClient client = new OcrClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IDCardOCRRequest req = new IDCardOCRRequest(); + req.setImageBase64(base64ImgStr); + req.setCardSide(cardType); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IDCardOCRResponse resp = client.IDCardOCR(req); + log.info("身份证识别:["+phone+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + UserWorkerVo user = new UserWorkerVo(); + user.setName(resp.getName()); + user.setCardId(resp.getIdNum()); + user.setAddress(resp.getAddress()); + user.setBirthday(DateUtil.parse(resp.getBirth())); + user.setSex(resp.getSex()); + user.setNation(resp.getNation()); + user.setIssue(resp.getAuthority()); + String validDate = resp.getValidDate(); + if(StringUtils.isNotEmpty(validDate)){ + String[] vs = validDate.split("-"); + if( vs.length >1){ + user.setIssueDate(DateUtil.parseDate(vs[0].trim().replaceAll("\\.","-"))); + user.setExpiryDate(vs[1].trim().replaceAll("\\.","-")); + } + } + return user; + }catch(TencentCloudSDKException e){ + log.error("身份证OCR识别出错:手机号:{},状态码{},错误信息{}",phone,e.getErrorCode(),e.getMessage()); + throw e; + + }catch (Exception e){ + log.error("身份证OCR识别出错:手机号:{},错误信息{}",phone,e.getMessage()); + throw e; + } + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:36 + * 说明:银行卡识别 + **/ + private BankCardVo bankCardOcr(String phone, String base64ImgStr,ThirdConf config)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(), config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + OcrClient client = new OcrClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + BankCardOCRRequest req = new BankCardOCRRequest(); + + req.setImageBase64(base64ImgStr); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + BankCardOCRResponse resp = client.BankCardOCR(req); + log.info("银行卡识别:["+phone+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + BankCardVo backCard = new BankCardVo(); + backCard.setCardName(resp.getCardName()); + backCard.setCardNo(resp.getCardNo()); + backCard.setBankInfo(resp.getBankInfo()); + backCard.setCardType(resp.getCardType()); + return backCard; + }catch(TencentCloudSDKException e){ + log.error("银行卡OCR识别出错:手机号:{},状态码{},错误信息{}",phone,e.getErrorCode(),e.getMessage()); + throw e; + }catch (Exception e){ + log.error("银行卡OCR识别出错:手机号:{},错误信息{}",phone,e.getMessage()); + throw e; + } + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:50 + * 说明:银行卡三要素认证 + **/ + private boolean bankCard3(String bankCard,String name,String idCard)throws Exception{ + JSONObject result = JSONObject.parseObject( remoteJzqService.bankThreeVerify(name,idCard,bankCard)); + if(result.getString("success").equals("false")){ + log.error("银行卡三要素认证失败:银行卡号:{},姓名:{},身份证号:{},原因:{}",bankCard,name,idCard,result.getString("msg")); + throw new Exception(result.getString("msg")); + } + return result.getString("success").equals("true"); + } + + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:50 + * 说明:银行卡四要素认证 + **/ + private boolean bankCard4(String bankCard,String name,String phone,String idCard,ThirdConf conf)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + BankCard4EVerificationRequest req = new BankCard4EVerificationRequest(); + req.setName(name); + req.setBankCard(bankCard); + req.setIdCard(idCard); + req.setPhone(phone); + // 返回的resp是一个BankCard4EVerificationResponse的实例,与请求对象对应 + BankCard4EVerificationResponse resp = client.BankCard4EVerification(req); + log.info("银行卡四要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BankCard4Exception(resp.getDescription()); + } + } catch (TencentCloudSDKException e) { + log.error("银行卡四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},状态码{},错误信息{}",phone,name,idCard,bankCard,e.getErrorCode(),e.getMessage()); + throw e; + } catch(Exception e){ + e.printStackTrace(); + log.error("银行卡四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},错误信息{}",phone,name,idCard,bankCard,e.getMessage()); + throw e; + } + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 14:10 + * 说明:人脸核验获取BizToken + **/ + private FaceAuth faceAuth(String ruleId,String redirectUrl,String name,String idCard,ThirdConf conf) throws Exception{ + try { + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + DetectAuthRequest req = new DetectAuthRequest(); + req.setIdCard(idCard); + req.setName(name); + req.setRedirectUrl(redirectUrl); + req.setRuleId(ruleId); + // 返回的resp是一个DetectAuthResponse的实例,与请求对象对应 + DetectAuthResponse resp = client.DetectAuth(req); + FaceAuth fa = new FaceAuth(); + fa.setRedirectUrl(resp.getUrl()); + fa.setBizToken(resp.getBizToken()); + return fa; + + } catch (TencentCloudSDKException e) { + log.error("人脸核验获取BizToken:状态码{},错误信息{}", e.getErrorCode(), e.getMessage()); + throw e; + } catch (Exception e) { + e.printStackTrace(); + log.error("人脸核验获取BizToken,错误信息{}", e.getMessage()); + throw e; + } + + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 14:10 + * 说明:人脸核验结果 + **/ + private RemoteFile getDectInfo(String ruleId,String bizToken,ThirdConf conf) throws Exception{ + try { + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + GetDetectInfoEnhancedRequest req = new GetDetectInfoEnhancedRequest(); + + req.setRuleId(conf.getRuleId()); + req.setBizToken(bizToken); + + // 返回的resp是一个GetDetectInfoResponse的实例,与请求对象对应 + GetDetectInfoEnhancedResponse resp = client.GetDetectInfoEnhanced(req); + + if(resp.getText() != null && resp.getText().getErrCode() == 0){ + DetectInfoBestFrame baseFrame = resp.getBestFrame(); + if(baseFrame != null){ + String bestBase64 = baseFrame.getBestFrame(); + byte[] face = Base64.decode(bestBase64); + String fileName = UUID.fastUUID().toString(); + RemoteFile file = this.remoteFileService.upload(fileName,fileName+".png","image/png",face); + return file; + } + return new RemoteFile(); + }else{ + throw new RuntimeException(resp.getText().getErrMsg()); + } + } catch (TencentCloudSDKException e) { + log.error("查询人脸核验结果:状态码{},错误信息{}", e.getErrorCode(), e.getMessage()); + throw e; + } catch (Exception e) { + e.printStackTrace(); + log.error("查询人脸核验结果,错误信息{}", e.getMessage()); + throw e; + } + } + + + +} + + +@Data +class FaceAuth { + + //核验流程唯一密钥 + private String bizToken; + + //用于发起核身流程的 URL + private String redirectUrl; +} + + +@Data +class ThirdConf{ + + private String type; + + private String secretId; + + private String secretKey; + + private String endPoint; + + private String ruleId; + + private String redirectUrl; + + private String region; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java new file mode 100644 index 0000000..a400835 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java @@ -0,0 +1,806 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.SignType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.MerTaskSure; +import org.dromara.mp.domain.UserWorkerBiz; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.domain.vo.*; +import org.dromara.mp.mapper.MerTaskEnrollMapper; +import org.dromara.mp.mapper.MyTaskMapper; +import org.dromara.mp.mapper.UserWorkCheckinMapper; +import org.dromara.mp.service.IMyTaskService; +import org.dromara.mp.service.IUserWorkCheckinService; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.resource.api.RemoteDhqService; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteDhq; +import org.dromara.resource.api.domain.RemoteJzq; +import org.dromara.resource.api.domain.SignatoryReq; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskServiceImpl + * @description + * @create 2024-05-08 18:44 + */ +@Service +@Slf4j +public class MyTaskServiceImpl extends BaseService implements IMyTaskService { + + + @Resource + public MyTaskMapper myTaskMapper; + + @Resource + public MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + public UserWorkCheckinMapper checkinMapper; + + @Resource + public IUserWorkCheckinService userWorkerCheckinService; + + + @DubboReference + public RemoteDhqService remoteDhqService; + + @DubboReference + public RemoteJzqService remoteJzqService; + + + + @DubboReference + private RemoteConfigService remoteConfigService; + + + /**** + * 确认单 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signSurePro(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_conf"); + MerTaskSure uwb = this.myTaskMapper.selectTaskSure(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(uwb.getSignStatus() == null && StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + String originaNumber = "DHQQRD"+ IdUtil.getSnowflakeNextIdStr(); + RemoteDhq dhq = new RemoteDhq(); + dhq.setLaunchType("1"); + dhq.setContractName("用工确认单");//合同名称 + dhq.setContractModelNum(workerSignConfig.getString("tempCode")); + dhq.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + dhq.setLaunchSubject(uwb.getConPhone());//发起用户手机号 + dhq.setLaunchName(uwb.getConName()); + dhq.setLaunchEnterpriseName(uwb.getSysName());//发起企业名称(launchType为1企业发起合同时必传) +// dhq.setSignEnterpriseName(uwb.getSysName()); + dhq.setCustomerOriginationNumber(originaNumber);//客户发起时定义的编号 +// dhq.setInputValues(uwb.getProNo()+","+originaNumber+","+uwb.getSysName()+","+uwb.getCost()+","+uwb.getCreateTime()+"," +// +uwb.getWorkName()+","+uwb.getCardId()+","+uwb.getPhone()+","+uwb.getProContent());//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + + + List mapList=new ArrayList<>(); + Map map2 = new HashMap(); + map2.put("controlNumber",workerSignConfig.getString("pro_controlNumber")); + map2.put("writeContent",uwb.getProNo()); + mapList.add(map2); + Map map1 = new HashMap(); + map1.put("controlNumber",workerSignConfig.getString("xy_controlNumber")); + map1.put("writeContent",originaNumber); + mapList.add(map1); + Map map3 = new HashMap(); + map3.put("controlNumber",workerSignConfig.getString("fbf_controlNumber")); + map3.put("writeContent",uwb.getSysName()); + mapList.add(map3); + Map map4 = new HashMap(); + map4.put("controlNumber",workerSignConfig.getString("je_controlNumber")); + map4.put("writeContent",uwb.getCost()); + mapList.add(map4); + Map map51 = new HashMap(); + map51.put("controlNumber",workerSignConfig.getString("time_controlNumber")); + map51.put("writeContent",uwb.getCreateTime()); + mapList.add(map51); + Map map6 = new HashMap(); + map6.put("controlNumber",workerSignConfig.getString("user_controlNumber")); + map6.put("writeContent",uwb.getWorkName()); + mapList.add(map6); + Map map7 = new HashMap(); + map7.put("controlNumber",workerSignConfig.getString("card_controlNumber")); + map7.put("writeContent",uwb.getCardId()); + mapList.add(map7); + Map map8 = new HashMap(); + map8.put("controlNumber",workerSignConfig.getString("phone_controlNumber")); + map8.put("writeContent",uwb.getPhone()); + mapList.add(map8); +// int length = uwb.getProContent().replace("\t","").length(); +// int size = (length +38 -1) / 38 ; +// for(int i = 0; i < size ; i++){ +// if(i > 3){ +// break; +// } +// Map map9 = new HashMap(); +// map9.put("controlNumber",workerSignConfig.getString("txt1"+i+"_controlNumber")); +// map9.put("writeContent",uwb.getProContent().substring(i*38,i*38+38 > length?length -1:i*38+38)); +// mapList.add(map9); +// } + +// if(size < 4){ +// for( int i = size ; i < 4; i++){ +// Map map9 = new HashMap(); +// map9.put("controlNumber",workerSignConfig.getString("txt1"+i+"_controlNumber")); +// map9.put("writeContent",""); +// mapList.add(map9); +// } +// +// } + + + dhq.setInputValues(mapList); + + + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName",uwb.getConName());//经办人姓名 + map.put("userPhone",uwb.getConPhone());//经办人手机号 + map.put("type","1");//类型 0-个人 1-企业 + map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 + map.put("enterpriseName",uwb.getSysName());//企业名称(类型type为1时必传) + map.put("signNumber",workerSignConfig.getString("signNumber1")); //0签署方编号 + + Map map5 = new HashMap<>(); + map5.put("userName",uwb.getWorkName());//经办人姓名 + map5.put("userPhone",uwb.getPhone());//经办人手机号 + map5.put("type","0");//类型 0-个人 1-企业 + map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 + map5.put("signNumber",workerSignConfig.getString("signNumber2")); //0签署方编号 + data.add(map); + data.add(map5); + String s = JSONObject.toJSONString(data); + + + + String result = this.remoteDhqService.becomeSign(dhq,domain, SignType.USER_WORKER_CONFIRMATION); + if(StringUtils.isEmpty(result)){ + this.invalidationParamsException("获取签约连接失败"); + } + String signWebUrl = null; + String contractNum = null; + JSONObject resultObj = JSONObject.parseObject(result); + String code = resultObj.getString("code"); + if(StringUtils.isNotEmpty(code) && code.equals("200")){ + JSONObject jno = resultObj.getJSONObject("result"); + if(jno != null){ + JSONArray signWebUrls = jno.getJSONArray("signUrls"); + signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); + contractNum = jno.getString("contractNum"); + } + } + if(StringUtils.isEmpty(signWebUrl)){ + this.invalidationParamsException("获取签约连接失败"); + }else{ + MerTaskSure uwBiz = new MerTaskSure(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setSignNo(originaNumber); + this.myTaskMapper.updateTaskSure(uwBiz); + } + return signWebUrl; + } + + /**** + * 确认单 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signSureProJzq(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_conf"); + MerTaskSure uwb = this.myTaskMapper.selectTaskSure(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(uwb.getSignStatus() == null && StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + + + + RemoteJzq remoteJzq = new RemoteJzq(); + remoteJzq.setContractName("用工确认单"); //合同名称 + remoteJzq.setTemplateNo(workerSignConfig.getString("tempCode")); + remoteJzq.setServerCa(1); + remoteJzq.setDealType(5); + remoteJzq.setFileType(4); + String originaNumber = "4FDCA706A6D042D5A3FFF417A7C006A6"; + remoteJzq.setTemplateNo(originaNumber); + remoteJzq.setNotifyUrl("http://116.255.147.51/prod-api/resource/sign/acceptSure"); + Map mapList = new HashMap<>(); + mapList.put("corporatename", "薪资社"); + String jsonString = JSONObject.toJSONString(mapList); + remoteJzq.setTemplateParams(jsonString); + + + + + + List signatoryReqs = new ArrayList<>(); + + SignatoryReq signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getSysName()); + + + signatoriesReq.setIdentityType(11); + signatoriesReq.setIdentityCard(uwb.getNsrSbh()); + signatoriesReq.setEmail(uwb.getConEmail()); + signatoriesReq.setServerCaAuto(1); + signatoriesReq.setChapteJson("[{\"page\":4,\"chaptes\":[{\"offsetX\":0.121,\"offsetY\":0.3941}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setSignLevel(0); + signatoriesReq.setNoNeedVerify(1); + signatoryReqs.add(signatoriesReq); + + + signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getWorkName()); + signatoriesReq.setIdentityType(1); + signatoriesReq.setIdentityCard(uwb.getCardId()); + signatoriesReq.setMobile(uwb.getPhone()); + signatoriesReq.setServerCaAuto(0); + signatoriesReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.3047,\"offsetY\":0.2677}]},{\"page\":4,\"chaptes\":[{\"offsetX\":0.2378,\"offsetY\":0.1681}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setNoNeedVerify(1); //取消签约前短信校验 + signatoriesReq.setServerCaAuto(0);//是否使用自动签署完成,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效) + signatoriesReq.setSignLevel(1);//签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写,3个人方形标准章(用户类型是个人且姓名2-4个字符生效,其他情况默认使用系统标准图形章) + + + signatoryReqs.add(signatoriesReq); + + + remoteJzq.setSignatories(signatoryReqs); + + + + + String result = this.remoteJzqService.becomeSign(remoteJzq,domain, SignType.USER_WORKER_PROTOCOL); + JSONObject jsonObject = JSONObject.parseObject(result); + + if(jsonObject.getString("success").equals("false")){ + + this.invalidationParamsException(jsonObject.getString("msg")); + } + + String code = jsonObject.getString("data"); + + String data = this.remoteJzqService.link(code,uwb.getWorkName(),uwb.getCardId(),1); + + JSONObject resultObj = JSONObject.parseObject(data); + + if (resultObj.getString("success").equals("false")){ + this.invalidationParamsException("获取签约连接失败"); + } + + String signWebUrl = resultObj.getString("data"); + + MerTaskSure uwBiz = new MerTaskSure(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setSignNo(code); + this.myTaskMapper.updateTaskSure(uwBiz); + + return signWebUrl; + } + +// +// public static void main(String[] args) { +// String result = "{\"success\":true,\"message\":\"操作成功!\",\"code\":200,\"result\":{\"businessId\":\"95d6eb9ae14b4b6f8770467a37132c82\",\"contractNum\":\"2024081416141723623293870089\",\"applicationId\":\"2205026100\",\"signUrls\":[{\"signUserPhone\":\"15981832697\",\"signUserUrl\":\"https://openapi.signzg.com/copilot/index.html#/sign-info?dXNlcklkPTIzMjI1JnNpZ25JZD0xMzk1NQ==\"}]},\"timestamp\":1723623294932}"; +// JSONObject resultObj = JSONObject.parseObject(result); +// String code = resultObj.getString("code"); +// String signWebUrl ="中信银行(03020000)".replaceAll("[\\d()]",""); +// String contractNum =""; +// if(StringUtils.isNotEmpty(code) && code.equals("200")){ +// JSONObject jno = resultObj.getJSONObject("result"); +// if(jno != null){ +// JSONArray signWebUrls = jno.getJSONArray("signUrls"); +// signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); +// contractNum = jno.getString("contractNum"); +// } +// } +// +// } + + /**** + * 签约 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signPro(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_pro"); + + UserWorkerBiz uwb = this.myTaskMapper.selectHtInfoByUwbId(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + String originaNumber = "DHQUZ"+ IdUtil.getSnowflakeNextIdStr(); + RemoteDhq dhq = new RemoteDhq(); + dhq.setApplicationId(signConfig.getString("appId")); + dhq.setBusinessId(signConfig.getString("businessId")); + dhq.setContractName("用工签约");//合同名称 + dhq.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + dhq.setLaunchSubject(uwb.getConPhone());//发起用户手机号 + dhq.setContractModelNum(workerSignConfig.getString("tempCode")); + dhq.setLaunchName(uwb.getConName()); + dhq.setLaunchEnterpriseName(uwb.getGsmc());//发起企业名称(launchType为1企业发起合同时必传) +// dhq.setSignEnterpriseName(uwb.getGsmc()); + dhq.setCustomerOriginationNumber(originaNumber);//客户发起时定义的编号 +// dhq.setInputValues(uwb.getGsmc()+","+uwb.getConName()+","+uwb.getCardId()+","+uwb.getName()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+ DateUtils.getDate());//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + + + + + List mapList=new ArrayList<>(); + Map map2 = new HashMap(); + map2.put("controlNumber",workerSignConfig.getString("jf_controlNumber")); + map2.put("writeContent",uwb.getGsmc()); + mapList.add(map2); + Map map1 = new HashMap(); + map1.put("controlNumber",workerSignConfig.getString("jfuser_controlNumber")); + map1.put("writeContent",uwb.getConName()); + mapList.add(map1); + Map map3 = new HashMap(); + map3.put("controlNumber",workerSignConfig.getString("yf_controlNumber")); + map3.put("writeContent",uwb.getName()); + mapList.add(map3); + Map map4 = new HashMap(); + map4.put("controlNumber",workerSignConfig.getString("yfuser_controlNumber")); + map4.put("writeContent",uwb.getCardId()); + mapList.add(map4); + Map map51 = new HashMap(); + map51.put("controlNumber",workerSignConfig.getString("sys0_controlNumber")); + map51.put("writeContent",uwb.getGsmc()); + mapList.add(map51); + Map map6 = new HashMap(); + map6.put("controlNumber",workerSignConfig.getString("sys1_controlNumber")); + map6.put("writeContent",uwb.getGsmc()); + mapList.add(map6); + Map map7 = new HashMap(); + map7.put("controlNumber",workerSignConfig.getString("sys2_controlNumber")); + map7.put("writeContent",uwb.getGsmc()); + mapList.add(map7); + Map map8 = new HashMap(); + map8.put("controlNumber",workerSignConfig.getString("sys3_controlNumber")); + map8.put("writeContent",uwb.getGsmc()); + mapList.add(map8); + Map map9 = new HashMap(); + map9.put("controlNumber",workerSignConfig.getString("time_controlNumber")); + map9.put("writeContent",DateUtils.getDate()); + mapList.add(map9); + dhq.setInputValues(mapList); + + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName",uwb.getConName());//经办人姓名 + map.put("userPhone",uwb.getConPhone());//经办人手机号 + map.put("type","1");//类型 0-个人 1-企业 + map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 + map.put("enterpriseName",uwb.getGsmc());//企业名称(类型type为1时必传) + map.put("signNumber",workerSignConfig.getString("signNumber1")); //0签署方编号 + + Map map5 = new HashMap<>(); + map5.put("userName",uwb.getName());//经办人姓名 + map5.put("userPhone",uwb.getVPhone());//经办人手机号 + map5.put("type","0");//类型 0-个人 1-企业 + map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 + map5.put("signNumber",workerSignConfig.getString("signNumber2")); //0签署方编号 + data.add(map); + data.add(map5); + String s = JSONObject.toJSONString(data); + dhq.setSignatoryInfos(s);//签署方相关信息 + + + +// List> data=new ArrayList<>(); +// Map map = new HashMap<>(); +// map.put("userName",uwb.getName());//经办人姓名 +// map.put("userPhone",uwb.getVPhone());//经办人手机号 +// map.put("type","0");//类型 0-个人 1-企业 +// map.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// // map.put("type","1");//类型 0-个人 1-企业 +// // map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// // map.put("enterpriseName","贵州省七进制科技有限公司");//企业名称(类型type为1时必传) +// data.add(map); +// String s = JSONObject.toJSONString(data); +// dhq.setSignatoryInfos(s);//签署方相关信息 + + + String result = this.remoteDhqService.becomeSign(dhq,domain, SignType.USER_WORKER_PROTOCOL); + if(StringUtils.isEmpty(result)){ + this.invalidationParamsException("获取签约连接失败"); + } + String signWebUrl = null; + String contractNum = null; + JSONObject resultObj = JSONObject.parseObject(result); + String code = resultObj.getString("code"); + if(StringUtils.isNotEmpty(code) && code.equals("200")){ + JSONObject jno = resultObj.getJSONObject("result"); + if(jno != null){ + JSONArray signWebUrls = jno.getJSONArray("signUrls"); + signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); + contractNum = jno.getString("contractNum"); + } + + + } + if(StringUtils.isEmpty(signWebUrl)){ + this.invalidationParamsException("获取签约连接失败"); + }else{ + UserWorkerBiz uwBiz = new UserWorkerBiz(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setHtCode(originaNumber); + this.myTaskMapper.updateUserWorkerHtInfoByBizId(uwBiz); + } + return signWebUrl; + } + + /**** + * 签约 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signProJzq(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_pro"); + + + log.info(id+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + + UserWorkerBiz uwb = this.myTaskMapper.selectHtInfoByUwbId(id); + + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + if(ObjectUtils.isEmpty(uwb.getIsCA()) || uwb.getIsCA()==0){ + String name = uwb.getName(); + String identityCard = uwb.getCardId(); + String cardPositive = uwb.getCardPositive(); + String cardBack = uwb.getCardBack(); + // 保存文件的目录(使用临时目录) + String saveDir = "/www/wwwroot"; + // 保存的文件名 + String fileName = "downloaded_image.jpeg"; + String fileName1 = "downloaded_image1.jpeg"; + File file = createFileFromURL(cardPositive, saveDir, fileName); + File file1 = createFileFromURL(cardBack, saveDir, fileName1); + + + String s = remoteJzqService.cloudCertiPerInfo(name, identityCard, file, file1); + JSONObject parse = JSONObject.parseObject(s); + if (parse.getString("success").equals("false")){ + throw new Exception(parse.getString("msg")); + } + + this.myTaskMapper.updateCAStatus(name); + } + + + + RemoteJzq remoteJzq = new RemoteJzq(); + remoteJzq.setContractName("用工签约"); //合同名称 + remoteJzq.setTemplateNo(workerSignConfig.getString("tempCode")); + remoteJzq.setServerCa(1); + remoteJzq.setDealType(5); + remoteJzq.setFileType(4); + String originaNumber = "3B1EF1A9BD8B47E7A9E23BBE16408658"; + remoteJzq.setTemplateNo(originaNumber); + remoteJzq.setNotifyUrl("http://116.255.147.51/prod-api/resource/sign/accept"); + Map mapList = new HashMap<>(); + mapList.put("corporatename", "薪资社"); + String jsonString = JSONObject.toJSONString(mapList); + remoteJzq.setTemplateParams(jsonString); + + + + + + List signatoryReqs = new ArrayList<>(); + + SignatoryReq signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getGsmc()); + signatoriesReq.setIdentityType(11); + signatoriesReq.setIdentityCard(uwb.getNsrSbh()); + signatoriesReq.setEmail(uwb.getConEmail()); + signatoriesReq.setServerCaAuto(1); + signatoriesReq.setChapteJson("[{\"page\":4,\"chaptes\":[{\"offsetX\":0.121,\"offsetY\":0.3941}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setSignLevel(0); + signatoriesReq.setNoNeedVerify(1); + signatoryReqs.add(signatoriesReq); + + + signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getName()); + signatoriesReq.setIdentityType(1); + signatoriesReq.setIdentityCard(uwb.getCardId()); + signatoriesReq.setMobile(uwb.getVPhone()); + signatoriesReq.setServerCaAuto(0); + signatoriesReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.3047,\"offsetY\":0.2677}]},{\"page\":4,\"chaptes\":[{\"offsetX\":0.2378,\"offsetY\":0.1681}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setNoNeedVerify(1); //取消签约前短信校验 + signatoriesReq.setServerCaAuto(0);//是否使用自动签署完成,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效) + signatoriesReq.setSignLevel(1);//签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写,3个人方形标准章(用户类型是个人且姓名2-4个字符生效,其他情况默认使用系统标准图形章) + + + signatoryReqs.add(signatoriesReq); + + + remoteJzq.setSignatories(signatoryReqs); + + + String result = this.remoteJzqService.becomeSign(remoteJzq,domain, SignType.USER_WORKER_PROTOCOL); + JSONObject jsonObject = JSONObject.parseObject(result); + + if(jsonObject.getString("success").equals("false")){ + + this.invalidationParamsException(jsonObject.getString("msg")); + } + + String code = jsonObject.getString("data"); + + String data = this.remoteJzqService.link(code,uwb.getName(),uwb.getCardId(),1); + + JSONObject resultObj = JSONObject.parseObject(data); + + if (resultObj.getString("success").equals("false")){ + this.invalidationParamsException("获取签约连接失败"); + } + + String signWebUrl = resultObj.getString("data"); + + UserWorkerBiz uwBiz = new UserWorkerBiz(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setHtCode(code); + this.myTaskMapper.updateUserWorkerHtInfoByBizId(uwBiz); + + return signWebUrl; + } + + + public static File createFileFromURL(String fileUrl, String saveDir, String fileName) throws Exception { + // 确保保存目录存在 + File savePath = new File(saveDir); + if (!savePath.exists()) { + savePath.mkdirs(); + } + + // 创建目标文件 + File file = new File(saveDir, fileName); + + // 从URL下载文件并保存到本地 + try (InputStream inputStream = new URL(fileUrl).openStream(); + FileOutputStream outputStream = new FileOutputStream(file)) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + return file; + } + + + @Override + public TableDataInfo selTastList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selTastList(name,workId,pageQuery.build())); + } + + @Override + public TableDataInfo selMyTastList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selectMyTaskList(name,workId,pageQuery.build())); + } + + @Override + public TaskVo selTaskListDetail(Long id) { + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + + TaskVo vo = this.myTaskMapper.selTaskListDetail(id); + vo.setMerIsAuth(1); + vo.setVerifyStatus(0); + return vo; + } + + + @Override + public Boolean acceptTask(Long id,String no){ + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + + if(StringUtils.isEmpty(no)){ + this.invalidationParamsException("任务编码不能为空"); + } + + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setTaskId(id); + enroll.setTaskNo(no); + enroll.setCreateTime(new Date()); + enroll.setCreateBy(MpLoginHelper.getUserId()); + enroll.setVerifyStatus(1L); + enroll.setWorkId(MpLoginHelper.getUserId()); + enroll.setNo("ST"+StringUtils.randmNumber(12)); + this.getAddEnroll(enroll); + return true; + } + + @Override + public List selMyCheckPro() { + return this.myTaskMapper.selMyCheckPro(MpLoginHelper.getUserId()); + } + + @Override + public TaskVo selMyTaskDetail(Long id) { + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + Long workId = MpLoginHelper.getUserId(); + TaskVo taskVo = myTaskMapper.selMyTaskDetail(id,workId); + UserWorkCheckinBo bo = new UserWorkCheckinBo(); + bo.setUserWorkId(workId); + bo.setProId(taskVo.getTaskId()); + List checkInList = this.userWorkerCheckinService.queryList(bo); + taskVo.setCheckInVolist(checkInList); + return taskVo; + + } + + @Override + public int updOverReport(MerTaskEnroll enroll) { + + if(enroll.getId() == null){ + this.invalidationParamsException("ID不能为空"); + } + if(StringUtils.isEmpty(enroll.getTaskDesc())){ + this.invalidationParamsException("交付内容不能为空"); + } + + if(StringUtils.isEmpty(enroll.getTaskPic())){ + this.invalidationParamsException("交付图片不能为空"); + } + enroll.setUpdateBy(MpLoginHelper.getUserId()); + enroll.setUpdateTime(new Date()); + enroll.setTaskStatus(1); + return this.merTaskEnrollMapper.updateById(enroll); + } + + @Override + public MerTaskEnrollVo selOverReport(Long id) { + if(id == null){ + this.invalidationParamsException("ID不能为空"); + } + MerTaskEnrollVo mtev = this.merTaskEnrollMapper.selectVoById(id); + + MerTaskEnrollVo result = new MerTaskEnrollVo(); + if(mtev != null){ + result.setId(mtev.getId()); + result.setTaskDesc(mtev.getTaskDesc()); + result.setTaskPic(mtev.getTaskPic()); + } + return result; + } + + @Override + public TableDataInfo selMyHtList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selHtListByWorkId(workId,pageQuery.build())); + } + + + @Override + public TableDataInfo selProSureDoc(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selProSureDoc(workId,pageQuery.build())); + } + + + private void getAddEnroll(MerTaskEnroll enroll) { + try{ + this.merTaskEnrollMapper.insert(enroll); + }catch (DuplicateKeyException e){ + enroll.setNo("ST"+StringUtils.randmNumber(12)); + this.getAddEnroll(enroll); + } + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java new file mode 100644 index 0000000..80b1dcb --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java @@ -0,0 +1,202 @@ +package org.dromara.mp.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWokerOperBo; +import org.dromara.mp.domain.vo.SettlementChannelVo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.UserWorkerAccountMapper; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.ISettlementAccountService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementAccountServiceImpl + * @description + * @create 2024-05-08 14:11 + */ + +@Service +public class SettlementAccountServiceImpl extends BaseService implements ISettlementAccountService { + + @DubboReference + private RemoteDictService remoteDictService; + + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @DubboReference + private RemoteAccountService accountService; + + + + + @Override + public List getSettleChannel() { + List list = remoteDictService.selectDictDataByType("pay_channel"); + QueryWrapper wapper = new QueryWrapper(); + wapper.eq("work_id",MpLoginHelper.getUserId()); + wapper.eq("is_default",1); + wapper.eq("status",1); + List uwaList = this.userWorkerAccountMapper.selectVoList(wapper); + + List settlementChannelVoList = new ArrayList<>(); + for(RemoteDictDataVo vo : list){ + SettlementChannelVo stcv = new SettlementChannelVo(); + stcv.setChannelName(vo.getDictLabel()); + uwaList.stream().filter(item->item.getPassage().equals(vo.getDictLabel())).forEach(item->{ + stcv.setBankCard(StringUtils.bankHide(item.getBankCard())); + stcv.setId(item.getId()); + stcv.setBankName(item.getBankType()); + stcv.setCardType(item.getCardType()); + }); + settlementChannelVoList.add(stcv); + } + + return settlementChannelVoList; + } + + @Override + public List getBankList(String bankName) { + List list = remoteDictService.selectDictDataByType("bank_list"); + + if(StringUtils.isNotEmpty(bankName)){ + List list1 = new ArrayList<>(); + list.stream().filter(item -> item.getDictLabel().contains(bankName)).forEach(item -> { + list1.add(item); + }); + return list1; + } + return list; + } + + + /*** + * 添加结算账户 + * @param bankType 银行类型 + * @param name 姓名 + * @param bankCard 银行卡号 + * @param channelName 通道名称 + * @param phone 手机号 + * @param bankPic 银行卡图片 + * @return + */ + @Transactional + public int addAccount(String bankType, String name, String bankCard,String channelName,String phone, + String bankPic,String cardType){ + + if(StringUtils.isEmpty(channelName)){ + List channelList = remoteDictService.selectDictDataByType("pay_channel"); + if(channelList != null && !channelList.isEmpty()){ + channelName = channelList.get(0).getDictLabel(); + }else{ + throw new MpException("系统无可用结算通道"); + } + } + + UserWokerOperBo bo = new UserWokerOperBo(); + bo.setChannelName(channelName); + bo.setWorkId(MpLoginHelper.getUserId()); + + List accountList= this.userWorkerAccountMapper.selctBankInfoByUidChannelBankNo(bo); + long isDefault = 1; + UserWorkerAccountVo hav = null; + if(accountList != null && !accountList.isEmpty()){ + for(UserWorkerAccountVo vo :accountList){ + if(bankCard.equals(vo.getBankCard())){ + hav = vo; + } + if(vo.getIsDefault().intValue() == 1 ){ + isDefault = 0; + } + } + } + + UserWorkerAccount uwa1 = new UserWorkerAccount(); + uwa1.setWorkId(MpLoginHelper.getUserId()); + uwa1.setIsDefault(0L); + uwa1.setUpdateTime(new Date()); + this.userWorkerAccountMapper.updateById(uwa1); + + if(hav != null){ + UserWorkerAccount userwo = new UserWorkerAccount(); + userwo.setStatus(1); + userwo.setId(hav.getId()); + userwo.setIsDefault(1L); + userwo.setPassage(channelName); + userwo.setBankCardPic(bankPic); + userwo.setBankType(bankType); + userwo.setCardType(cardType); + this.userWorkerAccountMapper.updateById(userwo); + return 1; + } + + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bankCard); + bankAcc.setBankType(bankType); + bankAcc.setUnitId(0L); + bankAcc.setName(name); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId != null){ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setCreateBy(MpLoginHelper.getUserId()); + userWorkerAccount.setWorkId(MpLoginHelper.getUserId()); + userWorkerAccount.setCreateTime(new Date()); + userWorkerAccount.setPassage(channelName); + userWorkerAccount.setAccId(Long.valueOf(accountId)); + userWorkerAccount.setBankCardPic(bankPic); + userWorkerAccount.setBankCard(bankCard); + userWorkerAccount.setBankType(bankType); + userWorkerAccount.setCardType(cardType); + userWorkerAccount.setIsDefault(1L); + userWorkerAccount.setPhone(phone); + return this.userWorkerAccountMapper.insert(userWorkerAccount); + }else{ + return -1; + } + } + + @Override + public UserWorkerAccountVo getBankDetail(Long id) { + if(id == null){ + this.invalidationParamsException("ID不能为空"); + } + UserWorkerAccountVo vo = this.userWorkerAccountMapper.selectVoById(id); + + + if(vo != null){ + vo.setAccId(null); + UserWorkerVo user = this.userWorkerMapper.selectVoById(vo.getWorkId()); + vo.setName(user.getName()); + } + return vo; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java new file mode 100644 index 0000000..e462f04 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java @@ -0,0 +1,282 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.MpContants; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.bo.SysUnitDomainBo; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.SysUnitDomainMapper; +import org.dromara.mp.service.ISysUnitDomainService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.TencentSmsConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.*; + +/** + * 单位域名配置Service业务层处理 + * + * @author LionLi + * @date 2024-04-07 + */ +@RequiredArgsConstructor +@Service +public class SysUnitDomainServiceImpl implements ISysUnitDomainService { + + private static final Logger log = LoggerFactory.getLogger(SysUnitDomainServiceImpl.class); + private final SysUnitDomainMapper baseMapper; + @DubboReference + public RemoteSmsService smsService; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 17:45 + * 说明:发送验证码 + **/ + + public boolean sendSms(String phone,String domainCode){ + SysUnitDomain smsConfig = this.selSmsConfig(domainCode); + if(smsConfig == null){ + throw new MpException("站点未配置短信参数"); + } + + if(StringUtils.isEmpty(phone)){ + throw new MpException("手机号不能为空"); + } + +// String type = (String)smsConfig.get("type"); +// String sign = (String)smsConfig.get("sign"); +// String accid = (String)smsConfig.get("accid"); +// String acckey = (String)smsConfig.get("acckey"); +// String appid = (String)smsConfig.get("appid"); +// String temp_dlyzm = (String)smsConfig.get("temp_dlyzm"); +// +// TencentSmsConfig tencentSmsConfig = new TencentSmsConfig(); +// +// tencentSmsConfig.setAccessKeyId(accid); +// tencentSmsConfig.setAccessKeySecret(acckey); +// tencentSmsConfig.setSignature(sign); +// tencentSmsConfig.setSdkAppId(appid); +// tencentSmsConfig.setTemplateId(temp_dlyzm); + + String key = GlobalConstants.CAPTCHA_MP_PHONE_CODE_KEY+SmsType.MP.getIType() + phone; + String code = RandomUtil.randomNumbers(4); + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isNotEmpty(cacheCode)){ + throw new MpException("2分钟内不能重复发送"); + } + + + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); +// RedisUtils.setCacheObject(key, code, Duration.ofMinutes(1000)); + LinkedHashMap map = new LinkedHashMap<>(2); + map.put("code", code); + map.put("expirs","2"); + Map map1 = new HashMap<>(); + map1.put("smsConfig", smsConfig.getSmsConfig()); + // smsConfig.put("tempId","temp_dlyzm"); + + this.smsService.sendSmsCode(SmsType.MP,phone,map,map1); + + return true; + } + + + /** + * 查询单位域名配置 + */ + @Override + public SysUnitDomainVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public SysUnitDomainVo queryByMpDomain(String mpDomain) { + + if(StringUtils.isEmpty(mpDomain)){ + throw new MpException("站点域名不能为空!"); + } + String cacheKey = MpContants.MP_DOMAIN_KEY+mpDomain.hashCode() ; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + if(mpDomainVo == null){ + SysUnitDomainBo bo = new SysUnitDomainBo(); + bo.setStatus(1); + bo.setWeChatDomainName(mpDomain); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + mpDomainVo = this.baseMapper.selectOne(lqw); + if(mpDomainVo != null){ + RedisUtils.setCacheObject(cacheKey,mpDomainVo); + }else{ + throw new MpException("未配置公众号站点信息"); + } + } + + SysUnitDomainVo domainVo = new SysUnitDomainVo(); + domainVo.setWebsiteName(mpDomainVo.getWebsiteName()); + domainVo.setHotline(mpDomainVo.getHotline()); + domainVo.setCopyright(mpDomainVo.getCopyright()); + domainVo.setWapBanner(mpDomainVo.getWapBanner()); + domainVo.setWapLogo(mpDomainVo.getWapLogo()); + domainVo.setWeChatPub(mpDomainVo.getWeChatPub()); + domainVo.setMpDomainHashCode(mpDomain.hashCode()+""); + domainVo.setPrivacyAgreement(mpDomainVo.getPrivacyAgreement()); + domainVo.setMobileUserAgreement(mpDomainVo.getMobileUserAgreement()); + + return domainVo; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:39 + * 说明:获取短信配置 + **/ + + @Override + public SysUnitDomain selSmsConfig(String domainCode) { + + + log.info(domainCode+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + + if(mpDomainVo != null){ +// String smsConfigStr = mpDomainVo.getSmsConfig(); +// return JsonUtils.parseObject(smsConfigStr,Map.class); + return mpDomainVo; + } + + return null; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:39 + * 说明:获取人脸核验等其他配置 + **/ + @Override + public Map mpOtherThirdConfig(String domainCode) { + + String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + if(mpDomainVo != null){ + String thirdConfigStr = mpDomainVo.getWeChatThirdParams(); + return JsonUtils.parseObject(thirdConfigStr,Map.class); + } + return null; + + } + + + /** + * 查询单位域名配置列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public List queryList(SysUnitDomainBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitDomainBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDomainName()), SysUnitDomain::getDomainName, bo.getDomainName()); + lqw.like(StringUtils.isNotBlank(bo.getWebsiteName()), SysUnitDomain::getWebsiteName, bo.getWebsiteName()); + lqw.eq(StringUtils.isNotBlank(bo.getHotline()), SysUnitDomain::getHotline, bo.getHotline()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyright()), SysUnitDomain::getCopyright, bo.getCopyright()); + lqw.eq(StringUtils.isNotBlank(bo.getRecordNo()), SysUnitDomain::getRecordNo, bo.getRecordNo()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyrightUrl()), SysUnitDomain::getCopyrightUrl, bo.getCopyrightUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageLogo()), SysUnitDomain::getLoginPageLogo, bo.getLoginPageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageBanner()), SysUnitDomain::getLoginPageBanner, bo.getLoginPageBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getHomePageLogo()), SysUnitDomain::getHomePageLogo, bo.getHomePageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapLogo()), SysUnitDomain::getWapLogo, bo.getWapLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapBanner()), SysUnitDomain::getWapBanner, bo.getWapBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatPub()), SysUnitDomain::getWeChatPub, bo.getWeChatPub()); + lqw.eq(StringUtils.isNotBlank(bo.getPcLoginProtocol()), SysUnitDomain::getPcLoginProtocol, bo.getPcLoginProtocol()); + lqw.eq(StringUtils.isNotBlank(bo.getMobileUserAgreement()), SysUnitDomain::getMobileUserAgreement, bo.getMobileUserAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getPrivacyAgreement()), SysUnitDomain::getPrivacyAgreement, bo.getPrivacyAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatDomainName()),SysUnitDomain::getWeChatDomainName,bo.getWeChatDomainName()); + lqw.eq(bo.getStatus() != null, SysUnitDomain::getStatus, bo.getStatus()); + lqw.eq(bo.getBusRole() != null, SysUnitDomain::getBusRole, bo.getBusRole()); + lqw.eq(bo.getBusId() != null, SysUnitDomain::getBusId, bo.getBusId()); + return lqw; + } + + /** + * 新增单位域名配置 + */ + @Override + public Boolean insertByBo(SysUnitDomainBo bo) { + SysUnitDomain add = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位域名配置 + */ + @Override + public Boolean updateByBo(SysUnitDomainBo bo) { + SysUnitDomain update = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnitDomain entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位域名配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java new file mode 100644 index 0000000..b37d113 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java @@ -0,0 +1,125 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.date.DateTime; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.mapper.UserWorkCheckinMapper; +import org.dromara.mp.service.IUserWorkCheckinService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者打卡记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class UserWorkCheckinServiceImpl implements IUserWorkCheckinService { + + private final UserWorkCheckinMapper baseMapper; + + /** + * 查询自雇者打卡记录 + */ + @Override + public UserWorkCheckinVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者打卡记录列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkCheckinBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者打卡记录列表 + */ + @Override + public List queryList(UserWorkCheckinBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserWorkCheckinBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getRevision() != null, UserWorkCheckin::getRevision, bo.getRevision()); + lqw.eq(StringUtils.isNotBlank(bo.getCreatedBy()), UserWorkCheckin::getCreatedBy, bo.getCreatedBy()); + lqw.eq(bo.getCreatedTime() != null, UserWorkCheckin::getCreatedTime, bo.getCreatedTime()); + lqw.eq(StringUtils.isNotBlank(bo.getUpdatedBy()), UserWorkCheckin::getUpdatedBy, bo.getUpdatedBy()); + lqw.eq(bo.getProId() != null, UserWorkCheckin::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getProNum()), UserWorkCheckin::getProNum, bo.getProNum()); + lqw.eq(bo.getUpdatedTime() != null, UserWorkCheckin::getUpdatedTime, bo.getUpdatedTime()); + lqw.eq(bo.getUserWorkId() != null, UserWorkCheckin::getUserWorkId, bo.getUserWorkId()); + lqw.eq(StringUtils.isNotBlank(bo.getAddressInfo()), UserWorkCheckin::getAddressInfo, bo.getAddressInfo()); + lqw.eq(StringUtils.isNotBlank(bo.getLongi()), UserWorkCheckin::getLongi, bo.getLongi()); + lqw.eq(StringUtils.isNotBlank(bo.getLati()), UserWorkCheckin::getLati, bo.getLati()); + lqw.orderByDesc(UserWorkCheckin::getCreatedTime); + return lqw; + } + + /** + * 新增自雇者打卡记录 + */ + @Override + public Boolean insertByBo(UserWorkCheckinBo bo) { + UserWorkCheckin add = MapstructUtils.convert(bo, UserWorkCheckin.class); + add.setUserWorkId(MpLoginHelper.getUserId()); + add.setCreatedTime(new Date()); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者打卡记录 + */ + @Override + public Boolean updateByBo(UserWorkCheckinBo bo) { + UserWorkCheckin update = MapstructUtils.convert(bo, UserWorkCheckin.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkCheckin entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者打卡记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java new file mode 100644 index 0000000..7bd4e9a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java @@ -0,0 +1,141 @@ +package org.dromara.mp.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.IUserWorkerService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerServiceImpl implements IUserWorkerService { + + private final UserWorkerMapper baseMapper; + + /** + * 查询自雇者 + */ + @Override + public UserWorkerVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + /** + * 查询自雇者列表 + */ + @Override + public List queryList(UserWorkerBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserWorkerBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), UserWorker::getOpenId, bo.getOpenId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), UserWorker::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), UserWorker::getPhone, bo.getPhone()); + lqw.eq(bo.getIsAuthentication() != null, UserWorker::getIsAuthentication, bo.getIsAuthentication()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), UserWorker::getCardId, bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getCardPositive()), UserWorker::getCardPositive, bo.getCardPositive()); + lqw.eq(StringUtils.isNotBlank(bo.getCardBack()), UserWorker::getCardBack, bo.getCardBack()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), UserWorker::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), UserWorker::getBankCard, bo.getBankCard()); + lqw.eq(bo.getIsAuth() != null, UserWorker::getIsAuth, bo.getIsAuth()); + lqw.eq(bo.getIsSign() != null, UserWorker::getIsSign, bo.getIsSign()); + lqw.eq(bo.getSignTime() != null, UserWorker::getSignTime, bo.getSignTime()); + lqw.eq(bo.getIsRegister() != null, UserWorker::getIsRegister, bo.getIsRegister()); + lqw.eq(StringUtils.isNotBlank(bo.getPhotoPath()), UserWorker::getPhotoPath, bo.getPhotoPath()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), UserWorker::getSex, bo.getSex()); + lqw.eq(StringUtils.isNotBlank(bo.getTag()), UserWorker::getTag, bo.getTag()); + lqw.eq(StringUtils.isNotBlank(bo.getUserArea()), UserWorker::getUserArea, bo.getUserArea()); + lqw.like(StringUtils.isNotBlank(bo.getUserAreaName()), UserWorker::getUserAreaName, bo.getUserAreaName()); + lqw.eq(bo.getAddTime() != null, UserWorker::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), UserWorker::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), UserWorker::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, UserWorker::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getNation()), UserWorker::getNation, bo.getNation()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), UserWorker::getAddress, bo.getAddress()); + lqw.eq(bo.getBirthday() != null, UserWorker::getBirthday, bo.getBirthday()); + lqw.eq(StringUtils.isNotBlank(bo.getIssue()), UserWorker::getIssue, bo.getIssue()); + lqw.eq(bo.getIssueDate() != null, UserWorker::getIssueDate, bo.getIssueDate()); + lqw.eq(StringUtils.isNotBlank(bo.getExpiryDate()), UserWorker::getExpiryDate, bo.getExpiryDate()); + lqw.eq(StringUtils.isNotBlank(bo.getReferrerBy()), UserWorker::getReferrerBy, bo.getReferrerBy()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), UserWorker::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(bo.getStatus() != null, UserWorker::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增自雇者 + */ + @Override + public Boolean insertByBo(UserWorkerBo bo) { + UserWorker add = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者 + */ + @Override + public Boolean updateByBo(UserWorkerBo bo) { + UserWorker update = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorker entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java new file mode 100644 index 0000000..fa7b526 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java @@ -0,0 +1,48 @@ +package org.dromara.mp.util; + +import cn.hutool.core.codec.Base64; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +/** + * @author sunzexing + * @version 1.0 + * @title ImgUtil + * @description + * @create 2024-08-19 11:28 + */ +public class ImgUtil { + + + + public static byte[] scaleImg(InputStream in,float scale){ + if(in == null){ + return null; + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try{ + cn.hutool.core.img.ImgUtil.scale(in,out,scale); + }catch(Exception e){ + e.printStackTrace(); + return null; + }finally { + try{ + in.close(); + }catch (Exception e){ + e.printStackTrace(); + } + } + return out.toByteArray(); + } + + + public static String scaleImgToBase64(InputStream in,float scale){ + byte[] bytes = scaleImg(in,scale); + if(bytes == null){ + return null; + } + return Base64.encode(bytes); + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml b/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml new file mode 100644 index 0000000..03e3a4c --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9214 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-mp + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt new file mode 100644 index 0000000..834d1d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt @@ -0,0 +1,18 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + # # + # # ########## + # # # # # + # # # # # # + # # # # # # + # # # ### ######### + # # # ## # # + # # ### ############### + ## # # # # # + # # # # # + # # # # # ########## + # # # # # # # + # # # # # # # + ######### # # ### # + # # # # # # + # diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..2c90f13 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml new file mode 100644 index 0000000..8d0f5e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml new file mode 100644 index 0000000..1880eb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update user_worker_business set update_time = now() + , sign_url = #{signUrl} + , web_url = #{viewUrl} + , no = #{htCode} + where id = #{id} + + + + + + + + + + update mer_task_enroll t set update_time = now() + ,sign_url = #{signUrl} + ,sign_status = #{signStatus} + ,sign_no = #{signNo} + where id = #{id} + + + + update user_worker set is_CA = 1 where name = #{name} + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml new file mode 100644 index 0000000..212f2a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml new file mode 100644 index 0000000..68b2cbc --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml new file mode 100644 index 0000000..56bf400 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml new file mode 100644 index 0000000..e77953b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-payment/Dockerfile b/ruoyi-modules/ruoyi-payment/Dockerfile new file mode 100644 index 0000000..4c1bb0a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/payment/logs \ + /ruoyi/payment/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/payment + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-payment.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-payment/pom.xml b/ruoyi-modules/ruoyi-payment/pom.xml new file mode 100644 index 0000000..4a058e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/pom.xml @@ -0,0 +1,176 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-payment + + + ruoyi-payment系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-job + + + + + org.dromara + ruoyi-api-system + + + + + org.dromara + ruoyi-api-payment + + + + + org.dromara + ruoyi-api-resource + + + + org.dromara + ruoyi-api-payment + + + + org.dromara + ruoyi-api-settlement + + + + com.alibaba.cloud + spring-cloud-starter-stream-rocketmq + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.987 + + + org.springframework.cloud + spring-cloud-commons + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java new file mode 100644 index 0000000..b92953c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java @@ -0,0 +1,26 @@ +package org.dromara.payment; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@EnableAsync +@SpringBootApplication +public class RuoYiPaymentApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiPaymentApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 代发薪资模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java new file mode 100644 index 0000000..4492bd1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java @@ -0,0 +1,389 @@ +package org.dromara.payment.bill.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.listener.BillImportListener; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.payment.task.service.IMerTaskService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.http.MediaType; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 账单 + * 前端访问路由地址为:/payment/bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/bill") +public class MerBillController extends BaseController { + + private final IMerBillService merBillService; + + private final IMerBillDetailService billDetailService; + + private final IMerTaskService merTaskService; + + private final IMerTaskEnrollService merTaskEnrollService; + + private final StreamBridge streamBridge; + + private void bindDataPermission(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 查询代发批次列表 + */ + @SaCheckPermission("payment:bill:list") + @GetMapping("/list") + public TableDataInfo list(MerBillBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 服务商接单审批代发列表 + */ + @GetMapping("/orderApprovalList") + public TableDataInfo orderApprovalList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 服务商接单审批代发待审批数量 + */ + @GetMapping("/orderApprovalCount") + public R orderApprovalCount(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + bo.setStatus(0l);//已提交 + bo.setSydVerifyStatus(1);//待审批 + return R.ok(merBillService.queryListCount(bo)); + } + + /** + * 导出接单审批代发列表 + */ + @Log(title = "导出接单审批代发列表", businessType = BusinessType.EXPORT) + @PostMapping("/exportOrderApproval") + public void exportOrderApproval(MerBillBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + List list = merBillService.queryList(bo); + ExcelUtil.exportExcel(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response); + } + + /** + * 商户出款审批代发列表 + */ + @GetMapping("/paymentApprovalList") + public TableDataInfo paymentApprovalList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return new TableDataInfo(); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 商户出款审批代发待审批数量 + */ + @GetMapping("/paymentApprovalCount") + public R paymentApprovalCount(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return R.ok(0); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + bo.setStatus(1l);//已接单 + bo.setVerifyStatus(1l);//待审批 + return R.ok(merBillService.queryListCount(bo)); + } + + /** + * 导出出款审批代发列表 + */ + @Log(title = "导出出款审批代发列表", businessType = BusinessType.EXPORT) + @PostMapping("/exportPaymentApproval") + public void exportPaymentApproval(MerBillBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + List list = new ArrayList<>(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + list = new ArrayList<>(); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + list = merBillService.queryList(bo); + } + + +// ExcelUtil.exportExcel(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response,fieldList); + } + + /** + * 出款审批 + */ + @Log(title = "出款审批", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping() + public R paymentApproval(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setVerifyBy(loginUser.getNickname()); + Boolean rtn = merBillService.paymentApproval(bo); + if (rtn && bo.getVerifyStatus() == 3){//审核通过 + JSONObject queueParam = new JSONObject(); + queueParam.put("billId", bo.getId()); + streamBridge.send("bill-out-0", MessageBuilder.withPayload(queueParam).build()); + } + return toAjax(rtn); + } + + /** + * 导出代发B2B回单 + * @param billIds 代发批次id(多个逗号分隔) + */ + @Log(title = "导出代发B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2B") + public void exportB2B(@NotBlank(message = "代发批次id不能为空") String billIds, HttpServletResponse response) throws IOException { + MerBillDetailBo where = new MerBillDetailBo(); + where.setBillIds(billIds); + where.setPayStatus(1);//支付成功 + List details = billDetailService.queryList(where); + List b2bs = StreamUtils.toList(details,MerBillDetailVo::getPayReceiptB2b, b2b -> StringUtils.isNotBlank(b2b)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2bs); + } + + /** + * 导出代发批次列表 + */ +// @SaCheckPermission("payment:bill:export") + @Log(title = "代发批次导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerBillBo bo, HttpServletResponse response,String fields) { + bindDataPermission(bo); + List list = merBillService.queryList(bo); + + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "代发批次", MerBillVo.class, response,fieldList); + } + + /** + * 获取账单详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:bill:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merBillService.queryById(id)); + } + + + + /** + * 获取账单详细信息 + * @param no 编码 + * + */ + @SaCheckPermission("payment:bill:query") + @GetMapping("/getInfo/{no}") + public R getInfo(@NotNull(message = "账单编码不能为空") + @PathVariable String no) { + return R.ok(merBillService.queryByNo(no)); + } + + + /** + * 派单在线打款导入 + * @param bo + * @return + */ + @Log(title = "派单在线打款导入", businessType = BusinessType.IMPORT) + @RepeatSubmit() + @PostMapping("/onlinePaymentImport") + public R> onlinePaymentImport(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + this.merBillService.validateSysSyd(bo); + return R.ok(merBillService.onlinePaymentImport(bo)); + } + + /** + * 抢单项目打款导入 + * @param bo + * @return + */ + @Log(title = "抢单项目打款导入", businessType = BusinessType.IMPORT) + @RepeatSubmit() + @PostMapping("/qdPaymentImport") + public R> qdPaymentImport(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + this.merBillService.validateSysSyd(bo); + return R.ok(merBillService.qdPaymentImport(bo)); + } + + /** + * 派单上传批量打款文件 + * @param file + * @param bo + * @return + * @throws Exception + */ + @Log(title = "派单上传批量打款文件", businessType = BusinessType.IMPORT) + @PostMapping(value = "/importBillData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R> importBillData(@RequestPart("file") MultipartFile file,AddBillBo bo) throws Exception { + this.merBillService.validateSysSyd(bo); + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(),new BillImportListener(bo)); + return R.ok(result); + } + + /** + * 接单审核 + */ + @Log(title = "接单审核", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/orderApproval") + public R orderApproval(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydVerifyBy(loginUser.getNickname()); + return toAjax(merBillService.orderApproval(bo)); + } + + /** + * 新增账单 + */ +// @SaCheckPermission("payment:bill:add") + @Log(title = "账单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merBillService.insertByBo(bo)); + } + + /** + * 修改账单 + */ + @SaCheckPermission("payment:bill:edit") + @Log(title = "账单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + return toAjax(merBillService.updateByBo(bo)); + } + + /** + * 删除账单 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:bill:remove") + @Log(title = "账单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merBillService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 查询待结算的抢单任务列表 + */ + @GetMapping("/balanceTaskList") + @Log(title = "查询待结算的抢单任务列表", businessType = BusinessType.OTHER) + public TableDataInfo list(MerTaskBo bo, PageQuery pageQuery) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.PLATFORM.getId()){ + return new TableDataInfo<>(); + } + bo.setStatus(1); + bo.setClassify(2l); + bo.setTaskStatusList(Arrays.asList(7,8)); + return merTaskService.queryPageList(bo, pageQuery); + } + + /** + * 查询待结算的抢单任务竞标人列表 + */ + @GetMapping("/balanceEnrollList") + @Log(title = "查询待结算的抢单任务竞标人列表", businessType = BusinessType.OTHER) + public TableDataInfo list(MerTaskEnrollBo bo, PageQuery pageQuery) { + bo.setTaskStatus(3); + bo.setSettlementStatus(0); + return merTaskEnrollService.queryPageList(bo, pageQuery); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java new file mode 100644 index 0000000..ff48256 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java @@ -0,0 +1,228 @@ +package org.dromara.payment.bill.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.RandomUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 账单明细 + * 前端访问路由地址为:/payment/billDetail + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/billDetail") +public class MerBillDetailController extends BaseController { + + private final IMerBillDetailService merBillDetailService; + + private final IBusChannelService channelService; + + /** + * 查询代发明细列表 + */ + @SaCheckPermission("payment:billDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerBillDetailBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + TableDataInfo rtn = merBillDetailService.queryPageList(bo, pageQuery); + filterChannelHalve(rtn.getRows()); + return rtn; + } + + private void bindDataPermission(MerBillDetailBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ +// bo.setParams(Map.of("channel_no",loginUser.getBusNo())); + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 过滤代理商分润数据权限 + * @param list + */ + private void filterChannelHalve(List list){ + if(list == null || list.size() == 0){ + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + for (MerBillDetailVo vo: + list) { + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeMoney(null); + vo.setZjChannelName(null); + vo.setZjServiceChargeMoney(null); + vo.setYwyChannelName(null); + vo.setYwyServiceChargeMoney(null); + } + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + BusChannelVo channelVo = channelService.queryById(loginUser.getBusId()); + for (MerBillDetailVo vo: + list) { + if(channelVo.getDwLevel() == 2){// 2:总监 + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeMoney(null); + vo.setFhzxServiceChargeRate(null); + }else if(channelVo.getDwLevel() == 3){//3:业务员 + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeRate(null); + vo.setFhzxServiceChargeMoney(null); + vo.setZjChannelName(null); + vo.setZjServiceChargeRate(null); + vo.setZjServiceChargeMoney(null); + } + } + } + } + + /** + * 导出代发明细列表 + */ + @SaCheckPermission("payment:billDetail:export") + @Log(title = "代发明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerBillDetailBo bo, HttpServletResponse response,String fields) { + bindDataPermission(bo); + List list = merBillDetailService.queryList(bo); + filterChannelHalve(list); + List noF = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + noF = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "账单明细", MerBillDetailVo.class, response,noF); + } + + + /** + * 导出代发明细列表 + */ +// @SaCheckPermission("payment:billDetail:export") + @Log(title = "代发明细", businessType = BusinessType.EXPORT) + @PostMapping("/exportDetail") + public void exportDetail(MerBillDetailBo bo, HttpServletResponse response,String notFilds) { + bindDataPermission(bo); + List list = merBillDetailService.queryList(bo); + filterChannelHalve(list); + List noF = new ArrayList(); + if(StringUtils.isNotBlank(notFilds)){ + noF = Arrays.asList(notFilds.split(",")); + } + ExcelUtil.exportExcelInclude(list, "收益明细", MerBillDetailVo.class, response,noF); + } + + /** + * 导出代发B2C回单 + * @param billDetailIds 代发明细id(多个逗号分隔) + */ + @Log(title = "导出代发B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2C") + public void exportB2C(@NotBlank(message = "代发明细id不能为空") String billDetailIds, HttpServletResponse response) throws IOException { + MerBillDetailBo where = new MerBillDetailBo(); + where.setParams(Map.of("ids",billDetailIds)); + List details = merBillDetailService.queryList(where); + List b2cs = StreamUtils.toList(details,MerBillDetailVo::getPayReceipt, b2c -> StringUtils.isNotBlank(b2c)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2cs); + } + + /** + * 获取账单明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:billDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merBillDetailService.queryById(id)); + } + + /** + * 新增账单明细 + */ + @SaCheckPermission("payment:billDetail:add") + @Log(title = "账单明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerBillDetailBo bo) { + return toAjax(merBillDetailService.insertByBo(bo)); + } + + /** + * 修改账单明细 + */ + @SaCheckPermission("payment:billDetail:edit") + @Log(title = "账单明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerBillDetailBo bo) { + return toAjax(merBillDetailService.updateByBo(bo)); + } + + + @Log(title = "补发失败明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/rePay") + public R rePay(@RequestBody MerBillDetailBo bo){ + return toAjax(merBillDetailService.rePay(bo)); + } + + + /** + * 删除账单明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:billDetail:remove") + @Log(title = "账单明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merBillDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java new file mode 100644 index 0000000..579f4cc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java @@ -0,0 +1,281 @@ +package org.dromara.payment.bill.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 账单对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_bill") +public class MerBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + private Long serviceChargeType; + + /** + * 服务费比例 + */ + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + private Date payTime; + + /** + * 发放时间 + */ + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + private String passage; + + /** + * 批次下账单明细数量 + */ + @TableField(exist = false) + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java new file mode 100644 index 0000000..7b430c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java @@ -0,0 +1,372 @@ +package org.dromara.payment.bill.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; + +import java.io.Serial; + +/** + * 账单明细对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_bill_detail") +public class MerBillDetail extends BusId { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + /** + * 服务商服务费率 + */ + private BigDecimal sydServiceChargeRate; + + //商户服务费率 + private BigDecimal shServiceChargeRate; + + /** + * 服务商分润(分) + */ + private Long sydServiceChargeMoney; + + /** + * 运营商分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer opHalveStatus; + + /** + * 运营商分润失败原因 + */ + private String opHalveRemark; + + /** + * 服务商分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer sydHalveStatus; + + /** + * 服务商分润失败原因 + */ + private String sydHalveRemark; + + /** + * 平台分润(分) + */ + private Long ptServiceChargeMoney; + + /** + * 平台分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer ptHalveStatus; + + /** + * 平台分润失败原因 + */ + private String ptHalveRemark; + + private Integer thridRecruit; + + private String thridRecruitReason; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java new file mode 100644 index 0000000..be4abb4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java @@ -0,0 +1,34 @@ +package org.dromara.payment.bill.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.bill.domain.MerBill; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 账单业务对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AddBillBo extends MerBillBo { + + @NotNull + @Size(min = 1,message = "账单详情不为空") + private List details; + + + private String domain; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java new file mode 100644 index 0000000..18936cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java @@ -0,0 +1,4 @@ +package org.dromara.payment.bill.domain.bo; + +public class BillImportBo { +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java new file mode 100644 index 0000000..b5c9e9f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java @@ -0,0 +1,316 @@ +package org.dromara.payment.bill.domain.bo; + +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 账单业务对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerBill.class, reverseConvertGenerate = false) +public class MerBillBo extends BusId { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代发批次id(多个逗号分隔) + */ + private String ids; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class }) + private Long taskId; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class }) + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + @NotBlank(message = "批次号不能为空", groups = { AddGroup.class }) + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + @NotNull(message = "服务费承担方式不能为空", groups = { AddGroup.class }) + private Long serviceChargeType; + + /** + * 服务费比例 + */ + @NotNull(message = "服务费比例不能为空", groups = { AddGroup.class }) + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date payTime; + + /** + * 发放时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class }) + private String passage; + + /** + * 批次下账单明细数量 + */ + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ +// @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class }) + private String opNo; + + /** + * 运营商id + */ +// @NotNull(message = "运营商id不能为空", groups = { AddGroup.class }) + private Long opId; + + /** + * 代理商id + */ +// @NotNull(message = "代理商id不能为空", groups = { AddGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ +// @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class }) + private String merNo; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class }) + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class }) + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式不能为空", groups = { AddGroup.class }) + private Integer chargeMode; + + /** + * 支付密码 + */ + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java new file mode 100644 index 0000000..5a3362d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java @@ -0,0 +1,297 @@ +package org.dromara.payment.bill.domain.bo; + +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; + +/** + * 账单明细业务对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerBillDetail.class, reverseConvertGenerate = false) +public class MerBillDetailBo extends BusId { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 代发批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + @NotNull(message = "账单金额(个人应得)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal moneyDecimal; + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + + /*** + * 企业支付(分) + */ + private Long qyzf; + + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + + private String errorMsg; + + private String password; + + private String payStatuStrs; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java new file mode 100644 index 0000000..541839a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.bill.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.bill.domain.RemoteMerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 账单明细Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerBillDetailVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java new file mode 100644 index 0000000..beae61e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.bill.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.bill.domain.RemoteMerBillVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 账单Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java new file mode 100644 index 0000000..cf36bc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java @@ -0,0 +1,589 @@ +package org.dromara.payment.bill.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.payment.bill.domain.MerBillDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单明细视图对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerBillDetail.class) +public class MerBillDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String cno; + + /** + * 流水号(系统内部编号) + */ + @ExcelProperty(value = "订单号") + private String busNo; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + + @ExcelProperty(value = "企业名称") + private String merName; + + @ExcelProperty(value = "服务商名称") + private String sydName; + + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + /** + * 账单id + */ +// @ExcelProperty(value = "账单id") + @ExcelIgnore + private Long billId; + + /** + * 自雇者id + */ +// @ExcelProperty(value = "自雇者id") + @ExcelIgnore + private Long workerId; + + /** + * 姓名 + */ + @ExcelProperty(value = "收款人") + private String workerName; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String cardId; + + + /** + * 银行账号 + */ + @ExcelProperty(value = "结算账户") + private String bankCard; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String workerPhone; + + /** + * 自雇者报名id + */ +// @ExcelProperty(value = "自雇者报名id") + @ExcelIgnore + private Long workerEnrollId; + + + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + + /** + * 银行账户id + */ + @ExcelIgnore + private Integer bankAccId; + + /** + * 开户行 + */ +// @ExcelProperty(value = "开户行") + @ExcelIgnore + private String bankCheque; + + + /** + * 账单金额(个人应得) + */ + @ExcelIgnore + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + /** + * 个税 + */ +// @ExcelProperty(value = "个税") + @ExcelIgnore + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ +// @ExcelProperty(value = "实收金额(账单金额-个人承担的服务费)", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "到=手金额") + + @ExcelIgnore + private Long amount; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amount); + } + + @ExcelProperty(value="打款金额(元)") + private String amountStr; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + @ExcelProperty(value = "打款状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=待支付,1=成功,2=失败,3=支付中,4=已取消") + private Integer payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "备注") + private String payRemark; + + /** + * B2C回执单地址 + */ +// @ExcelProperty(value = "B2C回执单地址") + @ExcelIgnore + private String payReceipt; + + /** + * 服务费(分) + */ +// @ExcelProperty(value = "服务费(分)") + @ExcelIgnore + private Long serviceChargeMoney; + + + /** + * 交易号(银行流水号) + */ + @ExcelProperty(value = "交易号(银行流水号)") + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ +// @ExcelProperty(value = "计算代理费金额", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "公=司开票金额C/个人应得金额P") + @ExcelIgnore + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ +// @ExcelProperty(value = "是否退款", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + @ExcelIgnore + private Integer isRefund; + + /** + * 退款时间 + */ +// @ExcelProperty(value = "退款时间") + @ExcelIgnore + private Date refundTime; + + /** + * 三方订单号 + */ +// @ExcelProperty(value = "三方订单号") + @ExcelIgnore + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ +// @ExcelProperty(value = "是否三方订单", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + @ExcelIgnore + private Long isOut; + + + + /** + * 项目id + */ +// @ExcelProperty(value = "项目id") + @ExcelIgnore + private Long taskId; + + /** + * 项目编号 + */ +// @ExcelProperty(value = "项目编号") + @ExcelIgnore + private String taskNo; + + /** + * 结算中心id + */ +// @ExcelProperty(value = "结算中心id") + @ExcelIgnore + private Long sydId; + + /** + * 结算中心编号 + */ +// @ExcelProperty(value = "结算中心编号") + @ExcelIgnore + private String sydNo; + + /** + * 运营商编号 + */ +// @ExcelProperty(value = "运营商编号") + @ExcelIgnore + private String opNo; + + /** + * 运营商id + */ +// @ExcelProperty(value = "运营商id") + @ExcelIgnore + private Long opId; + + /** + * 代理商id + */ +// @ExcelProperty(value = "代理商id") + @ExcelIgnore + private Long channelId; + + /** + * 代理商编号 + */ +// @ExcelProperty(value = "代理商编号") + @ExcelIgnore + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @ExcelProperty(value = "代理商上下级关系编码") + @ExcelIgnore + private String channelCode; + + /** + * 商户id + */ +// @ExcelProperty(value = "商户id") + @ExcelIgnore + private Long merId; + + /** + * 商户编号 + */ +// @ExcelProperty(value = "商户编号") + @ExcelIgnore + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ +// @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包")\ + @ExcelIgnore + private Integer busType; + + /** + * B2B回执单地址 + */ +// @ExcelProperty(value = "B2B回执单地址") + @ExcelIgnore + private String payReceiptB2b; + + @ExcelProperty(value = "计费模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=个人应得计费,2=开票金额计费") +// @ExcelIgnore + private Integer chargeMode; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") +// @ExcelIgnore + private String proNo; + + public String getShServiceChargeRateStr() { + return StringUtils.perStr(this.shServiceChargeRate); + } + + @ExcelProperty(value = "产品费率") + private String shServiceChargeRateStr; + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ +// @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") +//// @ExcelIgnore +// private Integer chargeMode; + + /** + * 运营商服务费率 + */ +// @ExcelProperty(value = "运营商服务费率") + @ExcelIgnore + private BigDecimal opServiceChargeRate; + + + public String getOpServiceChargeRateStr() { + return StringUtils.perStr(this.opServiceChargeRate); + } + + @ExcelProperty(value = "运营商服务费率") + private String opServiceChargeRateStr; + + /** + * 运营商分润(分) + */ +// @ExcelProperty(value = "运营商分润(分)") + @ExcelIgnore + private Long opServiceChargeMoney; + + public String getOpServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.opServiceChargeMoney); + } + @ExcelProperty(value = "运营商分润") + private String opServiceChargeMoneyStr ; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") +// @ExcelIgnore + private String opName; + + /** + * 孵化中心名称 + */ + @ExcelProperty(value = "孵化中心名称") +// @ExcelIgnore + private String fhzxChannelName; + + /** + * 孵化中心服务费率 + */ +// @ExcelProperty(value = "孵化中心服务费率") + @ExcelIgnore + private BigDecimal fhzxServiceChargeRate; + + + public String getFhzxServiceChargeRateStr() { + return StringUtils.perStr(this.fhzxServiceChargeRate); + } + @ExcelProperty(value = "孵化中心服务费率") + private String fhzxServiceChargeRateStr; + + + /** + * 孵化中心收益(分) + */ +// @ExcelProperty(value = "孵化中心收益(分)") + @ExcelIgnore + private Long fhzxServiceChargeMoney; + + public String getFhzxServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.fhzxServiceChargeMoney); + } + @ExcelProperty(value = "孵化中心收益") + private String fhzxServiceChargeMoneyStr; + + /** + * 孵化中心id + */ +// @ExcelProperty(value = "孵化中心id") + @ExcelIgnore + private Long fhzxChannelId; + + + /** + * 总监名称 + */ + @ExcelProperty(value = "总监名称") +// @ExcelIgnore + private String zjChannelName; + + /** + * 总监服务费率 + */ +// @ExcelProperty(value = "总监服务费率") + @ExcelIgnore + private BigDecimal zjServiceChargeRate; + + public String getZjServiceChargeRateStr() { + return StringUtils.perStr(this.zjServiceChargeRate); + } + + @ExcelProperty(value = "总监服务费率") + private String zjServiceChargeRateStr; + + /** + * 总监收益(分) + */ +// @ExcelProperty(value = "总监收益(分)") + @ExcelIgnore + private Long zjServiceChargeMoney; + + public String getZjServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.zjServiceChargeMoney); + } + + @ExcelProperty(value = "总监收益") + private String zjServiceChargeMoneyStr; + + /** + * 总监id + */ +// @ExcelProperty(value = "总监id") + @ExcelIgnore + private Long zjChannelId; + + /** + * 业务员名称 + */ + @ExcelProperty(value = "业务员名称") +// @ExcelIgnore + private String ywyChannelName; + + + /** + * 业务员服务费率 + */ +// @ExcelProperty(value = "业务员服务费率") + @ExcelIgnore + private BigDecimal ywyServiceChargeRate; + + public String getYwyServiceChargeRateStr() { + return StringUtils.perStr(this.ywyServiceChargeRate); + } + @ExcelProperty(value = "业务员服务费率") + private String ywyServiceChargeRateStr; + + + /** + * 业务员收益(分) + */ +// @ExcelProperty(value = "业务员收益(分)") + @ExcelIgnore + private Long ywyServiceChargeMoney; + + + public String getYwyServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.ywyServiceChargeMoney); + } + + @ExcelProperty(value = "业务员收益") + private String ywyServiceChargeMoneyStr; + + /** + * 业务员id + */ +// @ExcelProperty(value = "业务员id") + @ExcelIgnore + private Long ywyChannelId; + + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ +// @ExcelProperty(value = "分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常)") + @ExcelIgnore + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + @ExcelProperty(value = "银行附言") + private String billRemark; + + /** + * 平台分润(分) + */ + @ExcelIgnore + private Long ptServiceChargeMoney; + + /** + * 平台分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + @ExcelIgnore + private Integer ptHalveStatus; + + /** + * 平台分润失败原因 + */ + @ExcelIgnore + private String ptHalveRemark; + + @ExcelIgnore + private BigDecimal shServiceChargeRate; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java new file mode 100644 index 0000000..efdd098 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java @@ -0,0 +1,448 @@ +package org.dromara.payment.bill.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.bill.domain.MerBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.common.domain.vo.BusOperLogVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 账单视图对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerBill.class) +public class MerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + + /** + * 项目id + */ +// @ExcelProperty(value = "项目id") + @ExcelIgnore + private Long taskId; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + @ExcelProperty(value = "批次号") + private String no; + + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "产品类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=委托代征") + private Integer busType; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + @ExcelProperty(value = "服务费承担方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=用工企业承担,2=自由职业者承担") + private Long serviceChargeType; + + + + /** + * 单月发放上限(分) + */ + @ExcelIgnore + private Long maxMonth; + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + @ExcelProperty(value = "单月发放上限") + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=增值税专用发票,2=增值税普通发票,3=差额票") + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=个人应得计费,2=开票金额计费") + private Integer chargeMode; + + + @ExcelIgnore + private String taskName; + + + /** + * 服务费比例 + */ + @ExcelProperty(value = "服务费率") + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + + @ExcelIgnore + private Long money; + + + @ExcelProperty(value = "总金额") + private String amountEntStr; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + @ExcelProperty(value = "结算金额") + private String moneyStr; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amountEnt - this.serviceChargeAmount); + } + + @ExcelProperty(value="实际打款金额") + private String amountStr; + + + + /** + * 服务费金额(分) + */ + @ExcelIgnore + private Long serviceChargeAmount; + + public String getServiceChargeAmountStr() { + return StringUtils.fenToYuanFormatter(this.serviceChargeAmount); + } + + @ExcelProperty(value = "服务费") + private String serviceChargeAmountStr; + + public String getAmountEntStr() { + return StringUtils.fenToYuanFormatter(this.amountEnt); + } + + /** + * 结算金额(分) + */ + @ExcelIgnore + private Long amountEnt; + + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + @ExcelProperty(value = "批次状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=已提交,1=已接单,2=发放中,3=发放成功,4=已撤消,5=已拒单,6=发放成功,7=发放失败,8=发放部分成功") + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + @ExcelProperty(value = "发放结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:全部成功,2=:全部失败,3=:部分成功") + private Long payStatus; + + /** + * 支付完成时间 + */ + @ExcelProperty(value = "支付完成时间") + private Date payTime; + + /** + * 发放类型 + */ + @ExcelProperty(value = "发放类型") + private String giveUpType = "灵工业务"; + + /** + * 发放时间 + */ + @ExcelProperty(value = "发放时间") + private Date giveUpTime; + + /** + * 发放人 + */ + @ExcelProperty(value = "发放人") + private String giveUpBy; + + + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + @ExcelProperty(value = "商户审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待审核,2=已拒绝,3=已通过") + private Long verifyStatus; + + /** + * 商户审核人 + */ + @ExcelProperty(value = "商户审核人") + private String verifyBy; + + /** + * 商户审核时间 + */ + @ExcelProperty(value = "商户审核时间") + private Date verifyTime; + + /** + * 商户备注 + */ + @ExcelProperty(value = "商户备注") + private String verifyReason; + + + + /** + * 批次下账单明细数量 + */ + @ExcelProperty(value = "批次下账单明细数量") + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + @ExcelProperty(value = "代理费是否出账", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=否,1=是") + private Long isAgencyFee; + + /** + * 完税税票号 + */ + @ExcelProperty(value = "完税税票号") + private String wssph; + + /** + * 委托代征个税税票号 + */ + @ExcelProperty(value = "委托代征个税税票号") + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + @ExcelProperty(value = "税票号编辑时间") + private Date sphTime; + + /** + * 税票号编辑人 + */ + @ExcelProperty(value = "税票号编辑人") + private String sphBy; + + /** + * 三方订单号 + */ + @ExcelProperty(value = "三方订单号") + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + @ExcelProperty(value = "是否三方订单", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=否,1=是") + private Long isOut; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + + + + + /** + * 产品id + */ +// @ExcelProperty(value = "产品id") + @ExcelIgnore + private Long proId; + + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + @ExcelProperty(value = "结算中心审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待审核,2=已拒绝,3=已通过") + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ +// @ExcelProperty(value = "结算中心审核人") + @ExcelIgnore + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + //@ExcelProperty(value = "结算中心审核时间") + @ExcelIgnore + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + //@ExcelProperty(value = "结算中心备注") + @ExcelIgnore + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + @ExcelProperty(value = "开票状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=待开票,1=已开票") + private Integer isInvoice; + + + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=到卡,2=余额") + private Integer settlementStyle; + /** + * 操作日志 + */ + @ExcelIgnore + private List logs; + + /** + * 业务备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java new file mode 100644 index 0000000..e3e4601 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java @@ -0,0 +1,88 @@ +package org.dromara.payment.bill.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.core.IExcelListener; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.service.IMerBillService; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Map; + +/** + * 派单批量打款导入 + * + * @author Lion Li + */ +@Slf4j +public class BillImportListener extends AnalysisEventListener> implements IExcelListener,MerBillDetailBo> { + + private final IMerBillService billService; + + private AddBillBo bo; + + private ExcelResult result; + + private int row = 0; + + public BillImportListener(AddBillBo bo) { +// this.bo = MapstructUtils.convert(bo,AddBillBo.class); + this.bo = bo; + this.billService = SpringUtils.getBean(IMerBillService.class); + } + + @Override + public void invoke(Map data, AnalysisContext context) { + try { + if(row == 1){ + bo.setNo(data.get(1)); + }else if (row > 2){ + if(StringUtils.isNotBlank(data.get(0)) && StringUtils.isNotBlank(data.get(1)) && StringUtils.isNotBlank(data.get(2))){ + int size = data.size(); + if(bo.getDetails() == null){ + bo.setDetails(new ArrayList<>()); + } + if(bo.getDetails().size() >= 500){ + throw new ServiceException("单批次最大支持500条订单"); + } + MerBillDetailBo detail = new MerBillDetailBo(); + detail.setWorkerName(data.get(0)); + detail.setCardId(data.get(1)); + detail.setPassage(this.bo.getPassage()); + detail.setMoneyDecimal(new BigDecimal(data.get(2))); + if(size > 3){ + detail.setBankCard(data.get(3)); + } + if(size > 4){ + detail.setBankType(data.get(4)); + } + bo.getDetails().add(detail); + } + } + } catch (Exception e) { + log.error("第"+(row+2)+"行读取excel出错("+ JsonUtils.toJsonString(data) +"):", e); + throw e; + } + row++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + result = billService.onlinePaymentImport(bo); + } + + @Override + public ExcelResult getExcelResult() { + return result; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java new file mode 100644 index 0000000..7e7dc89 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.bill.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.bill.domain.vo.MerBillVo; + +import java.util.List; + +/** + * 账单明细Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerBillDetailMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + List selectAmountByCards(List cardIds,Integer proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java new file mode 100644 index 0000000..a08dcb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java @@ -0,0 +1,26 @@ +package org.dromara.payment.bill.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydProduct; + +import java.util.List; + +/** + * 账单Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerBillMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + Integer queryListCount(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java new file mode 100644 index 0000000..b34f7d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java @@ -0,0 +1,85 @@ +package org.dromara.payment.bill.service; + +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 账单明细Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerBillDetailService { + + /** + * 查询账单明细 + */ + MerBillDetailVo queryById(Long id); + + /** + * 查询账单明细列表 + */ + TableDataInfo queryPageList(MerBillDetailBo bo, PageQuery pageQuery); + + /** + * 查询账单明细列表 + */ + List queryList(MerBillDetailBo bo); + + /** + * 新增账单明细 + */ + Boolean insertByBo(MerBillDetailBo bo); + + /** + * 修改账单明细 + */ + Boolean updateByBo(MerBillDetailBo bo); + + /** + * 校验并批量删除账单明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 退账单明细 + * @author 张涛 + * @date 2022年3月3日 + * @param busNo 账单明细编号 + * @param trxamt 交易金额 + * @param reason 原因 + * @return 是否退账单明细 + */ + public boolean refundBillDetail(String busNo,Long trxamt,String reason); + + /** + * 处理代发整体完成后的结果 + * @param billId + */ + public void billResult(long billId); + + /** + * 代发明细失败 + * @param billId 代发id + * @param id 代发明细id + * @param reason 失败原因 + * @param isRefund 是否退款(0:否 1:是) + * @param isOut 是否三方代发 + */ + Boolean failBillDetail(long billId,Long id,String reason,int isRefund,Long isOut); + + + /**** + * 补发失败的明细 + * @param bo + * @return + */ + int rePay(MerBillDetailBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java new file mode 100644 index 0000000..9280562 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java @@ -0,0 +1,139 @@ +package org.dromara.payment.bill.service; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; +import java.util.function.Supplier; + +/** + * 账单Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerBillService { + /** + * 查询账单 + */ + MerBillVo queryById(Long id); + + /** + * 查询账单 + */ + MerBillVo queryByNo(String no); + + /** + * 查询账单列表 + */ + TableDataInfo queryPageList(MerBillBo bo, PageQuery pageQuery); + + /** + * 查询账单列表 + */ + List queryList(MerBillBo bo); + + Integer queryListCount(MerBillBo bo); + + /** + * 在线打款导入验证 + * @param bo + * @return + */ + public ExcelResult onlinePaymentImport(AddBillBo bo); + + /** + * 抢单项目打款导入验证 + * @param bo + * @return + */ + public ExcelResult qdPaymentImport(AddBillBo bo); + + /** + * 新增账单 + */ + Boolean insertByBo(AddBillBo bo); + + /** + * 接单审核 + */ + Boolean orderApproval(MerBillBo bo); + + /** + * 出款审批 + */ + Boolean paymentApproval(MerBillBo bo); + + /** + * 修改账单 + */ + Boolean updateByBo(MerBillBo bo); + + /** + * 校验并批量删除账单信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 商户转账到服务商B2B + * @param billId + * @return + */ + Boolean paymentToService(int billId); + + /** + * 服务商转账到个人B2C + * @param billDetailId + * @return + */ + Boolean paymentToWorker(int billDetailId); + + /** + * 服务商转账到个人B2C + * @return + */ + Boolean paymentToWorkers(MerBillVo bill); + + /** + * 代发交易业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog billTransaction(TranLogVo tlog, TransactionLog tran); + + /** + * 代发交易业务回置单 + * @param tlog 交易记录 + * @param callback 回置单地址 + * @return + */ + Boolean billTransactionCallback(TranLogVo tlog, String callback); + + /** + * 验证支付密码 + * @param role 角色 + * @param busId 业务id(商户id或服务商id) + * @param supplier 验证密码结果函数 + */ + Boolean checkPayPassword(BusRole role, long busId, Supplier supplier); + + + /*** + * 服务商验证 + * @param bo + */ + + public void validateSysSyd(AddBillBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java new file mode 100644 index 0000000..41f31dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java @@ -0,0 +1,425 @@ +package org.dromara.payment.bill.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.util.MoneyUtils; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 账单明细Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class MerBillDetailServiceImpl implements IMerBillDetailService { + + private final MerBillMapper billMapper; + + private final BusMerchantMapper shDao; + + private final MerBillDetailMapper baseMapper; + + private final BusMerchantMapper merchantMapper; + + private final IUserWorkerAccountService userWorkerAccountService; + + private final MerTaskEnrollMapper taskEnrollMapper; + + private final UserWorkerAccountMapper userWorkerAccountMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + + private final BusOperLogMapper operLogMapper; + + private final StreamBridge streamBridge; + + + @DubboReference + private RemoteNoticeService noticeService; + + /** + * 查询账单明细 + */ + @Override + public MerBillDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询账单明细列表 + */ + @Override + public TableDataInfo queryPageList(MerBillDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询账单明细列表 + */ + @Override + public List queryList(MerBillDetailBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerBillDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getCno()), "t.cno", bo.getCno()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), "t.bus_no", bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), "t.bill_no", bo.getBillNo()); + lqw.eq(bo.getBillId() != null, "t.bill_id", bo.getBillId()); + lqw.eq(bo.getWorkerId() != null, "t.worker_id", bo.getWorkerId()); + lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), "t.worker_name", bo.getWorkerName()); + lqw.eq(StringUtils.isNotBlank(bo.getWorkerPhone()), "t.worker_phone", bo.getWorkerPhone()); + lqw.eq(bo.getWorkerEnrollId() != null, "t.worker_enroll_id", bo.getWorkerEnrollId()); + lqw.like(StringUtils.isNotBlank(bo.getCardId()), "t.card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCheque()), "t.bank_cheque", bo.getBankCheque()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getRaise() != null, "t.raise", bo.getRaise()); + lqw.eq(bo.getAmount() != null, "t.amount", bo.getAmount()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), "t.pay_remark", bo.getPayRemark()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), "t.pay_receipt", bo.getPayReceipt()); + lqw.eq(bo.getServiceChargeMoney() != null, "t.service_charge_money", bo.getServiceChargeMoney()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), "t.bank_no", bo.getBankNo()); + lqw.eq(bo.getAgentMoney() != null, "t.agent_money", bo.getAgentMoney()); + lqw.eq(bo.getIsRefund() != null, "t.is_refund", bo.getIsRefund()); + lqw.eq(bo.getRefundTime() != null, "t.refund_time", bo.getRefundTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOutNo()), "t.out_no", bo.getOutNo()); + lqw.eq(bo.getIsOut() != null, "t.is_out", bo.getIsOut()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceiptB2b()), "t.pay_receipt_b2b", bo.getPayReceiptB2b()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), "t.pro_no", bo.getProNo()); + lqw.eq(bo.getChargeMode() != null, "t.charge_mode", bo.getChargeMode()); + lqw.eq(bo.getOpServiceChargeRate() != null, "t.op_service_charge_rate", bo.getOpServiceChargeRate()); + lqw.eq(bo.getOpServiceChargeMoney() != null, "t.op_service_charge_money", bo.getOpServiceChargeMoney()); + lqw.eq(bo.getFhzxServiceChargeRate() != null, "t.fhzx_service_charge_rate", bo.getFhzxServiceChargeRate()); + lqw.eq(bo.getFhzxServiceChargeMoney() != null, "t.fhzx_service_charge_money", bo.getFhzxServiceChargeMoney()); + lqw.eq(bo.getFhzxChannelId() != null, "t.fhzx_channel_id", bo.getFhzxChannelId()); + lqw.eq(bo.getZjServiceChargeRate() != null, "t.zj_service_charge_rate", bo.getZjServiceChargeRate()); + lqw.eq(bo.getZjServiceChargeMoney() != null, "t.zj_service_charge_money", bo.getZjServiceChargeMoney()); + lqw.eq(bo.getZjChannelId() != null, "t.zj_channel_id", bo.getZjChannelId()); + lqw.eq(bo.getYwyServiceChargeRate() != null, "t.ywy_service_charge_rate", bo.getYwyServiceChargeRate()); + lqw.eq(bo.getYwyServiceChargeMoney() != null, "t.ywy_service_charge_money", bo.getYwyServiceChargeMoney()); + lqw.eq(bo.getYwyChannelId() != null, "t.ywy_channel_id", bo.getYwyChannelId()); + lqw.eq(bo.getChannelHalveStatus() != null, "t.channel_halve_status", bo.getChannelHalveStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getBillRemark()), "t.bill_remark", bo.getBillRemark()); + lqw.in(StringUtils.isNotBlank(bo.getPayStatuStrs()),"t.pay_status",StringUtils.splitTo(bo.getPayStatuStrs(), Convert::toInt)); + lqw.in(StringUtils.isNotBlank(bo.getBillIds()),"t.bill_id",StringUtils.splitTo(bo.getBillIds(), Convert::toLong)); + lqw.in(StringUtils.isNotBlank(params.get("ids")),"t.id",StringUtils.splitTo((String)params.get("ids"), Convert::toLong)); + if(StringUtils.isNotBlank(params.get("begin_date")) && StringUtils.isNotBlank(params.get("end_date"))){ + lqw.between("t.add_time",bo.getParams().get("begin_date")+" 00:00:00",bo.getParams().get("end_date")+" 23:59:59"); + } + if(StringUtils.isNotBlank(params.get("syd_name"))){ + lqw.like("t2.gsmc",params.get("syd_name")); + } + if(StringUtils.isNotBlank(params.get("mer_name"))){ + lqw.like("t1.`name`",params.get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(params.get("op_name"))){ + lqw.like("t3.name",params.get("op_name")); + } + if(StringUtils.isNotBlank(params.get("fhzx_channel_name"))){ + lqw.like("t4.name",params.get("fhzx_channel_name")); + } + if(StringUtils.isNotBlank(params.get("zj_channel_name"))){ + lqw.like("t5.name",params.get("zj_channel_name")); + } + if(StringUtils.isNotBlank(params.get("ywy_channel_name"))){ + lqw.like("t6.name",params.get("ywy_channel_name")); + } + if(StringUtils.isNotBlank(params.get("fhzx_channel_no"))){ + lqw.eq("t4.no",params.get("fhzx_channel_no")); + } + if(StringUtils.isNotBlank(params.get("zj_channel_no"))){ + lqw.eq("t5.no",params.get("zj_channel_no")); + } + if(StringUtils.isNotBlank(params.get("ywy_channel_no"))){ + lqw.eq("t6.no",params.get("ywy_channel_no")); + } + + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增账单明细 + */ + @Override + public Boolean insertByBo(MerBillDetailBo bo) { + MerBillDetail add = MapstructUtils.convert(bo, MerBillDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改账单明细 + */ + @Override + public Boolean updateByBo(MerBillDetailBo bo) { + MerBillDetail update = MapstructUtils.convert(bo, MerBillDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerBillDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除账单明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 退账单明细 + * @author 张涛 + * @date 2022年3月3日 + * @param busNo 账单明细编号 + * @param trxamt 交易金额 + * @param reason 原因 + * @return 是否退账单明细 + */ + @Transactional(rollbackFor = Exception.class) + public boolean refundBillDetail(String busNo,Long trxamt,String reason) { + MerBillDetail billDetail = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBillDetail::getBusNo,busNo)); + if(billDetail != null && billDetail.getAmount().equals(trxamt)) { + if(billDetail.getPayStatus() != 1 && billDetail.getPayStatus() != 2) { + throw new ServiceException("订单["+busNo+"]处理中,退款操作["+reason+"]延后处理"); + } + if(billDetail.getPayStatus() == 1 && billDetail.getIsRefund() != 1) {//只退票已成功的 + //不用退服务费 + failBillDetail(billDetail.getBillId(),billDetail.getId(),reason,1,null); + } + return true; + } + return false; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean failBillDetail(long billId,Long id,String reason,int isRefund,Long isOut) { + if(id != null) { + MerBillDetail billDetail = baseMapper.selectById(id); + if(billDetail.getPayStatus() != 3){ + return false; + } + baseMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId, id) + .eq(MerBillDetail::getPayStatus, isRefund == 1 ? 1 : 3) + .set(MerBillDetail::getPayStatus, 2) + .set(MerBillDetail::getIsRefund,isRefund) + .set(MerBillDetail::getPayRemark, reason) + .set(MerBillDetail::getPayTime, new Date())); + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + //如果是退款,则从成功转到待结算,如果是直接失败,则从结算中到待结算 + taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId,billDetail.getWorkerEnrollId()) + .eq(MerTaskEnroll::getSettlementStatus,isRefund == 1 ? 1 : 2) + .set(MerTaskEnroll::getSettlementStatus,0));//待结算 + } + }else { + baseMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, billId) + .eq(MerBillDetail::getPayStatus, isRefund == 1 ? 1 : 3) + .set(MerBillDetail::getPayStatus, 2) + .set(MerBillDetail::getIsRefund,isRefund) + .set(MerBillDetail::getPayRemark, reason) + .set(MerBillDetail::getPayTime, new Date())); + taskEnrollMapper.updateSettlementStatusByBillId(billId,isRefund == 1 ? 1 : 2,0); + } + billResult(billId); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int rePay(MerBillDetailBo bo) { + MerBillDetailVo merBillDetailVo = this.baseMapper.selectVoById(bo.getId()); + if(merBillDetailVo == null){ + throw new ServiceException("账单明细ID无效"); + } + + if(merBillDetailVo.getPayStatus() != 2){ + throw new ServiceException("账单明细状态不正确,不能进行补发!"); + } + SpringUtils.getBean(IMerBillService.class).checkPayPassword(BusRole.MERCHANT, merBillDetailVo.getMerId(), () -> { + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,merBillDetailVo.getMerId())); + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + + log.info("补发账单原始数据:"+ JsonUtils.toJsonString(merBillDetailVo)); + log.info("补发账单修改数据:"+ JsonUtils.toJsonString(bo)); + + + bo.setPayStatus(3); //支付中 + + UserWorkerAccountBo uwab = new UserWorkerAccountBo(); + uwab.setWorkId(merBillDetailVo.getWorkerId()); + uwab.setPassage(merBillDetailVo.getPassage()); + uwab.setBankCard(bo.getBankCard()); + uwab.setBankType(bo.getBankType()); + uwab.setPhone(merBillDetailVo.getWorkerPhone()); + + UserWorkerAccount uwa = this.userWorkerAccountService.rePayMdyWorkerBank(uwab); + if(uwa == null){ + throw new ServiceException("添加用户银行账户错误!"); + } + bo.setBankAccId(uwa.getAccId().intValue()); + String[] mns = merBillDetailVo.getMerNo().split("-"); + bo.setBusNo("T"+mns[mns.length - 1]+IdUtil.getSnowflakeNextIdStr()); + MerBillDetail update = MapstructUtils.convert(bo, MerBillDetail.class); + this.baseMapper.updateById(update); + operLogMapper.insert(new BusOperLog("商户提交补发出款指令,明细ID:"+bo.getId(), BusRole.MERCHANT,merBillDetailVo.getBillId(),BusLogType.BILL.getId())); + JSONObject queueParam = new JSONObject(); + queueParam.put("billDetailId", bo.getId()); + streamBridge.send("bill-out-0", MessageBuilder.withPayload(queueParam).build()); + return 1; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void billResult(long billId) { + MerBillDetail where = new MerBillDetail(); + where.setBillId(billId); + Long status = 3l;//账单状态(0:初始状态,1:待支付 2:支付中 3:已支付:4:已取消) + boolean existsSuccess = false;//是否存在成功的 + boolean existsFail = false;//是否存在失败的 + List details = baseMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,billId).in(MerBillDetail::getPayStatus,0,1,2,3)); + for (MerBillDetail d : details) { + if (d.getPayStatus() == 0 || d.getPayStatus() == 3) { + status = null; + break; + } + if (d.getPayStatus() == 1) { + existsSuccess = true; + } + if (d.getPayStatus() == 2) { + existsFail = true; + } + } + if (status != null) { + MerBill bill = billMapper.selectById(billId); + MerBill updBill = new MerBill(); + updBill.setId(billId); + updBill.setStatus(status); + //支付结果(0:初始状态,1:全部成功 2:全部失败 3:部分失败) + if (existsSuccess && existsFail) { + updBill.setPayStatus(3l); + }else if (!existsSuccess && existsFail) { + updBill.setPayStatus(2l); + }else if (existsSuccess && !existsFail) { + updBill.setPayStatus(1l); + } + if(bill.getPayTime() == null) { + updBill.setPayTime(new Date()); + } + billMapper.updateById(updBill); + if(bill.getPayTime() == null) { + BusMerchant merchant = shDao.selectById(bill.getMerId()); + String msg = String.format("%s商户在%s项目%s批次进行企业代付,支付金额%s元", merchant.getName(), bill.getTaskNo(), bill.getNo(), MoneyUtils.getMoneyFormatYuan(bill.getAmountEnt())); + if (existsFail) { + msg = msg + ",存在失败的"; + } + try{ + noticeService.addNotice(new RemoteSysNoticeVo("批次代发通知", msg, bill.getMerId().intValue(), BusRole.MERCHANT)); + noticeService.addNotice(new RemoteSysNoticeVo("批次代发通知", msg, bill.getSydId().intValue(), BusRole.SERVICE)); + }catch(Exception e){ + e.printStackTrace(); + } + } + if(updBill.getPayStatus() == 1) {//全部成功 + merchantAccountMapper.updateInvoiceSettlement(bill.getSydId(), bill.getMerId(), bill.getAmountEnt(), bill.getPassage()); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java new file mode 100644 index 0000000..0d83d99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java @@ -0,0 +1,1723 @@ +package org.dromara.payment.bill.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.IdcardUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.DefaultExcelResult; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.*; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.*; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.*; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.properties.PayPasswordProperties; +import org.dromara.payment.sys.domain.*; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.*; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.payment.util.MoneyUtils; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.time.Duration; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * 账单Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class MerBillServiceImpl extends BaseService implements IMerBillService { + + private final MerBillMapper baseMapper; + + private final SysSydMapper sydMapper; + + private final MerTaskMapper taskMapper; + + private final BusAccountsMapper accountsMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final MerBillDetailMapper billDetailMapper; + + private final MerTaskEnrollMapper taskEnrollMapper; + + private final BusMerchantMapper merchantMapper; + + private final BusMerchantConfigMapper merchantConfigMapper; + + private final BusMerchantFlowsMapper merchantFlowsMapper; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final UserWorkerMapper userWorkerMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final UserWorkerAccountMapper workerAccountDao;//自雇者账户dao + + private final IUserWorkerAccountService userWorkerAccountService; //自雇者账户服务 + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final IBusMerchantAccountService merchantAccountService; + + private final SysSydAccountMapper sydAccountDao;//结算中心账户dao + + private final ISysSydAccountService sydAccountService; + + private final SysSydConfigMapper sydConfigMapper; + + private final BusChannelMapper channelMapper; + + private final BusChannelProductMapper channelProductMapper; + + private final BusOperatorProductMapper operatorProductMapper; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusChannelAccountMapper channelAccountMapper; + + private final IBusChannelAccountService channelAccountService; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final BusOperLogMapper operLogMapper; + + private final BusMerchantProductMapper busMerchantProductMapper; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final IMerBillDetailService billDetailService; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + private final MerBillDetailMapper merBillDetailMapper; + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + @Resource(name="tencentIdCardAndOtherServiceImpl") + public IIdCardAndOtherService tencentIdCardAndOtherService; + + @Resource + private SysSydProductMapper sysSydProductMapper; + + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + @Autowired + private PayPasswordProperties payPasswordProperties; + + @Autowired + private IXyjService xyjService; + /** + * 查询账单 + */ + @Override + public MerBillVo queryById(Long id){ + MerBillBo where = new MerBillBo(); + where.setId(id); + List details = baseMapper.queryList(buildQueryWrapper(where)); + MerBillVo detail = null; + if (details.size() > 0){ + detail = details.get(0); + detail.setLogs(operLogMapper.selectVoList(new LambdaQueryWrapper().eq(BusOperLog::getBusId,id).eq(BusOperLog::getBusType, BusLogType.BILL.getId()))); + } + return detail; + } + + + /** + * 查询账单 + */ + @Override + public MerBillVo queryByNo(String no){ + MerBillBo where = new MerBillBo(); + where.setNo(no); + List details = baseMapper.queryList(buildQueryWrapper(where)); + MerBillVo detail = null; + if (details.size() > 0){ + detail = details.get(0); + detail.setLogs(operLogMapper.selectVoList(new LambdaQueryWrapper().eq(BusOperLog::getBusId,detail.getId()).eq(BusOperLog::getBusType, BusLogType.BILL.getId()))); + } + return detail; + } + + /** + * 查询账单列表 + */ + @Override + public TableDataInfo queryPageList(MerBillBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询账单列表 + */ + @Override + public List queryList(MerBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + @Override + public Integer queryListCount(MerBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryListCount(lqw); + } + + private QueryWrapper buildQueryWrapper(MerBillBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getId() != null, "t.id", bo.getId()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "t.no", bo.getNo()); + lqw.eq(bo.getServiceChargeType() != null, "t.service_charge_type", bo.getServiceChargeType()); + lqw.eq(bo.getServiceChargeRate() != null, "t.service_charge_rate", bo.getServiceChargeRate()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getServiceChargeAmount() != null, "t.service_charge_amount", bo.getServiceChargeAmount()); + lqw.eq(bo.getAmountEnt() != null, "t.amount_ent", bo.getAmountEnt()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(bo.getGiveUpTime() != null, "t.give_up_time", bo.getGiveUpTime()); + lqw.eq(StringUtils.isNotBlank(bo.getGiveUpBy()), "t.give_up_by", bo.getGiveUpBy()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "t.verify_by", bo.getVerifyBy()); + lqw.eq(bo.getVerifyTime() != null, "t.verify_time", bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), "t.verify_reason", bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(bo.getDetailCount() != null, "t.detailCount", bo.getDetailCount()); + lqw.eq(bo.getIsAgencyFee() != null, "t.is_agency_fee", bo.getIsAgencyFee()); + lqw.eq(StringUtils.isNotBlank(bo.getWssph()), "t.wssph", bo.getWssph()); + lqw.eq(StringUtils.isNotBlank(bo.getWtdzgssph()), "t.wtdzgssph", bo.getWtdzgssph()); + lqw.eq(bo.getSphTime() != null, "t.sph_time", bo.getSphTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSphBy()), "t.sph_by", bo.getSphBy()); + lqw.eq(StringUtils.isNotBlank(bo.getOutNo()), "t.out_no", bo.getOutNo()); + lqw.eq(bo.getIsOut() != null, "t.is_out", bo.getIsOut()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), "t.pro_no", bo.getProNo()); + lqw.eq(bo.getProId() != null, "t.pro_id", bo.getProId()); + lqw.eq(bo.getSydVerifyStatus() != null, "t.syd_verify_status", bo.getSydVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), "t.syd_verify_by", bo.getSydVerifyBy()); + lqw.eq(bo.getSydVerifyTime() != null, "t.syd_verify_time", bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), "t.syd_verify_reason", bo.getSydVerifyReason()); + lqw.eq(bo.getIsInvoice() != null, "t.is_invoice", bo.getIsInvoice()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(bo.getSettlementStyle() != null, "t.settlement_style", bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, "t.max_month", bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, "t.invoice_type", bo.getInvoiceType()); + lqw.eq(bo.getChargeMode() != null, "t.charge_mode", bo.getChargeMode()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("bill_status"))){ + Integer billStatus = Integer.parseInt(bo.getParams().get("bill_status").toString()); + if(billStatus <= 5){ + lqw.eq("t.status",billStatus); + }else { + lqw.eq("t.status",3); + if(billStatus == 6){//发放成功 + lqw.eq("t.pay_status",1); + }else if(billStatus == 7){//发放失败 + lqw.eq("t.pay_status",2); + }else if(billStatus == 8){//发放部分成功 + lqw.eq("t.pay_status",3); + } + } + } + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 生成代发明细项目子编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @param merNo 商户编号(A10049-B10070-M11312,运营商编号-代理商编号-商户编号) + * @return + */ + public String genBillNo(int retry,int maxRetry,String merNo){ + String no = getBillNo(merNo,DateUtils.dateTimeNow(DateUtils.YYYYMMDD)+"-"+RandomUtil.randomNumbers(7)); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerBill::getNo,no); + MerBill exist = baseMapper.selectOne(lqw); + if(exist != null){ + if(retry > maxRetry){ + throw new ServiceException("代发批次号生成出错"); + }else { + no = genBillNo(retry + 1,maxRetry,merNo); + } + } + return no; + } + + @Override + public ExcelResult qdPaymentImport(AddBillBo bo) { + return valiPaymentImport(bo); + } + + @Override + public ExcelResult onlinePaymentImport(AddBillBo bo) { + String curDate = DateUtils.dateTimeNow(DateUtils.YYYYMMDD); + if(!bo.getNo().startsWith(curDate)){ + throw new ServiceException("批次号格式不正确!"); + } + + if(bo.getDetails() == null){ + throw new ServiceException("请录入打款信息"); + } + + MerBill exist = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getNo,getBillNo(bo.getMerNo(),bo.getNo()))); + if(exist != null){ + throw new ServiceException("批次号重复,请勿重复提交!"); + } + return valiPaymentImport(bo); + } + + public ExcelResult valiPaymentImport(AddBillBo bo) { + BusMerchantConfig merchantConfig = merchantConfigMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantConfig::getMerId,bo.getMerId())); + if(merchantConfig == null){ + merchantConfig = new BusMerchantConfig(0,1,1000l,10000000l,120000000l); + merchantConfig.setIsNothing(0); + } + DefaultExcelResult rtn = new DefaultExcelResult<>(); + rtn.setAllRecords(bo.getDetails().size()); + List cardIds = bo.getDetails().stream().map(MerBillDetailBo::getCardId).distinct().collect(Collectors.toList()); + List workers = userWorkerMapper.selectByCardId(cardIds,bo.getPassage(),bo.getSydId(),bo.getMerId(),bo.getBusType()); + List cntBillAmountList = this.merBillDetailMapper.selectAmountByCards(cardIds,bo.getProId().intValue()); + SysSydProduct sysSydProduct = this.sysSydProductMapper.selectById(bo.getProId()); + if(sysSydProduct == null){ + this.invalidationParamsException("产品参数无效"); + } + //key:身份证号 value:自雇者 + Map cardIdMap = workers.stream().collect(Collectors.toMap(UserWorkerVo::getCardIdNoHide,userWorkerVo -> userWorkerVo)); + + Map cardIdAmoutMap = cntBillAmountList.stream().collect(Collectors.toMap(MerBillDetail::getCardId,merBillDetail -> merBillDetail)); + + for (MerBillDetailBo detail: + bo.getDetails()) { + + if(!IdcardUtil.isValidCard(detail.getCardId())){ + detail.setErrorMsg("身份证号无效!"); + rtn.getList().add(detail); + rtn.getErrorList().add("身份证号无效!"); + continue; + } + + + if(!cardIdMap.containsKey(detail.getCardId())){ + + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + + //不认证,不签约 + try{ + this.tencentIdCardAndOtherService.cardId2(detail.getWorkerName(),detail.getCardId(),bo.getDomain()); + long id = IdUtil.getSnowflakeNextId(); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + detail.setWorkerId(id); + userWorkerBo.setName(detail.getWorkerName()); + userWorkerBo.setCardId(detail.getCardId()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCreateTime(new Date()); + this.userWorkerMapper.insert(userWorkerBo); + detail.setWorkerId(userWorkerBo.getId()); + UserWorkerVo vo = BeanUtil.copyProperties(userWorkerBo,UserWorkerVo.class); + vo.setIsAuthentication(0L); + vo.setIsAuth(0L); + vo.setIsSign(0L); + cardIdMap.put(detail.getCardId(),vo); + + }catch(BaseException e ){ + rtn.getList().add(detail); + detail.setErrorMsg("身份证校验不通过"); + rtn.getErrorList().add("身份证校验不通过"); + continue; + }catch(Exception e){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("身份证校验失败"); + rtn.getErrorList().add("身份证校验失败"); + continue; + } + + + + }else{ + detail.setErrorMsg("客户信息不存在!"); + rtn.getList().add(detail); + rtn.getErrorList().add("客户信息不存在!"); + continue; + } + + }else{ + detail.setWorkerId(cardIdMap.get(detail.getCardId()).getId()); + } + + + + if(!cardIdMap.get(detail.getCardId()).getName().equals(detail.getWorkerName())){ + rtn.getList().add(detail); + detail.setErrorMsg("名字、身份证号不匹配!"); + rtn.getErrorList().add("名字、身份证号不匹配!"); + continue; + } + + + + + if(cardIdAmoutMap.get(detail.getCardId()) !=null && !sysSydProduct.getMaxMonth().equals(0L)){ + + if((cardIdAmoutMap.get(detail.getCardId()).getAmount() + MoneyUtils.getMoneyFen(detail.getMoneyDecimal())) > sysSydProduct.getMaxMonth()){ + detail.setErrorMsg("每月代发金额不能大于"+MoneyUtils.getMoneyFormatYuan(sysSydProduct.getMaxMonth())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(sysSydProduct.getMaxMonth())+"元!"); + continue; + } + } + + + + if(MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) < merchantConfig.getMinMoney()){ + detail.setErrorMsg("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMinMoney())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMinMoney())+"元!"); + continue; + } + if(MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) > merchantConfig.getMaxMoney()){ + detail.setErrorMsg("单笔代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoney())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoney())+"元!"); + continue; + } + if(StringUtils.isNotBlank(cardIdMap.get(detail.getCardId()).getMoneyYearDate())){ + String curYear = DateUtils.dateTimeNow(DateUtils.YYYY); + if(curYear.equals(cardIdMap.get(detail.getCardId()).getMoneyYearDate()) && cardIdMap.get(detail.getCardId()).getMoneyYear() + MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) > merchantConfig.getMaxMoneyYear()){ + detail.setErrorMsg("年代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoneyYear())+"元!"); + + rtn.getList().add(detail); + rtn.getErrorList().add("年代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoneyYear())+"元!"); + continue; + } + } + if(cardIdMap.get(detail.getCardId()).getIsAuth() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + }else{ + detail.setErrorMsg("该会员未实名认证!"); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未实名认证!"); + continue; + } + + } + if(cardIdMap.get(detail.getCardId()).getIsAuthentication() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + //未绑定银行卡 + if(StringUtils.isEmpty(detail.getBankCard())){ + detail.setErrorMsg("银行卡不能为空"); + rtn.getErrorList().add("银行卡不能为空"); + rtn.getList().add(detail); + continue; + } + + if(StringUtils.isEmpty(detail.getBankType())){ + rtn.getList().add(detail); + detail.setErrorMsg("所属银行不能为空"); + rtn.getErrorList().add("所属银行不能为空"); + continue; + } + if(addUserWorkerAccount(bo, detail, cardIdMap, rtn)) continue; + + }else{ + detail.setErrorMsg("该会员未绑定银行卡,会员号:"+cardIdMap.get(detail.getCardId()).getId()); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未绑定银行卡,会员号:"+cardIdMap.get(detail.getCardId()).getId()); + continue; + } + + }else{ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + //已绑定银行卡 + String bankCard = cardIdMap.get(detail.getCardId()).getBankCard(); + if(StringUtils.isNotEmpty(detail.getBankCard()) && !detail.getBankCard().equals(bankCard)){ + if(StringUtils.isEmpty(detail.getBankType())){ + rtn.getList().add(detail); + detail.setErrorMsg("所属银行不能为空"); + rtn.getErrorList().add("所属银行不能为空"); + continue; + } + if(addUserWorkerAccount(bo, detail, cardIdMap, rtn)) continue; + + } + } + + + } + + if(merchantConfig.getValiWorker() == 1 && cardIdMap.get(detail.getCardId()).getIsSign() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + }else{ + detail.setErrorMsg("该会员未签约!"); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未签约!"); + continue; + } + + } + } + if(rtn.getErrorList().size() == 0) { + for (MerBillDetailBo detail: + bo.getDetails()) { + detail.setWorkerId(cardIdMap.get(detail.getCardId()).getId()); + detail.setWorkerPhone(cardIdMap.get(detail.getCardId()).getPhoneNoHide()); + detail.setBankType(cardIdMap.get(detail.getCardId()).getBankType()); + detail.setBankCard(cardIdMap.get(detail.getCardId()).getBankCard()); + detail.setBankAccId(cardIdMap.get(detail.getCardId()).getBankAccId()); + detail.setMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + if(bo.getChargeMode() == 1){//个人应得计费 + if(bo.getServiceChargeType() == 1){//用工企业承担 + //企业支付 + BigDecimal qyzf = detail.getMoneyDecimal().multiply(new BigDecimal("1").add(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(detail.getMoney()); + detail.setQyzf(MoneyUtils.getMoneyFen(qyzf)); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(qyzf)-detail.getAmount()); + }else if(bo.getServiceChargeType() == 2) {//自由职业者承担 + //个人实得 + BigDecimal grsd = detail.getMoneyDecimal().multiply(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(MoneyUtils.getMoneyFen(grsd)); + detail.setQyzf(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())-detail.getAmount()); + } + }else if(bo.getChargeMode() == 2){//开票金额计费 + if(bo.getServiceChargeType() == 1){//用工企业承担 + //企业支付 + BigDecimal qyzf = detail.getMoneyDecimal().divide(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate())),2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(detail.getMoney()); + detail.setQyzf(MoneyUtils.getMoneyFen(qyzf)); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(qyzf)-detail.getAmount()); + }else if(bo.getServiceChargeType() == 2) {//自由职业者承担 + //个人实得 + BigDecimal grsd = detail.getMoneyDecimal().multiply(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(MoneyUtils.getMoneyFen(grsd)); + detail.setQyzf(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())-detail.getAmount()); + } + } + detail.setBillNo(bo.getNo()); + rtn.getList().add(detail); + } + } + return rtn; + } + + private boolean addUserWorkerAccount(AddBillBo bo, MerBillDetailBo detail, Map cardIdMap, DefaultExcelResult rtn) { + try{ + this.tencentIdCardAndOtherService.bankCard3(detail.getBankCard(), detail.getWorkerName(), detail.getCardId(), bo.getDomain()); +// Account bankAcc = new Account(); +// bankAcc.setType((short)2);//2:真实个人账户 +// bankAcc.setBankCard(detail.getBankCard()); +// bankAcc.setBankType(detail.getBankType()); +// bankAcc.setUnitId(0L); +// bankAcc.setName(detail.getWorkerName()); +// Result result = this.accountService.addAccount(bankAcc); +// Integer accountId = result.getRtnData().getId(); +// if(accountId == null){ +// this.invalidationParamsException("创建账号失败!"); +// } + + //添加银行卡 + UserWorkerAccountBo uwab = new UserWorkerAccountBo(); + uwab.setWorkId(detail.getWorkerId()); +// uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(detail.getBankCard()); + uwab.setPassage(detail.getPassage()); + uwab.setBankType(detail.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setCreateBy(LoginHelper.getUserId()); + uwab.setIsDefault(1L); + UserWorkerAccount uwa = this.userWorkerAccountService.rePayMdyWorkerBank(uwab); + if(uwa == null){ + this.invalidationParamsException("创建会员账户失败"); + } + cardIdMap.get(detail.getCardId()).setBankCard(detail.getBankCard()); + cardIdMap.get(detail.getCardId()).setBankType(detail.getBankType()); + cardIdMap.get(detail.getCardId()).setBankAccId(uwa.getAccId().intValue()); + cardIdMap.get(detail.getCardId()).setIsAuthentication(1L); + + }catch(BaseException e ){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("银行卡校验不通过"+e.getMessage()); + rtn.getErrorList().add("银行卡校验不通过"+e.getMessage()); + return true; +//// this.invalidationParamsException("银行卡校验不通过,"+e.getMessage()); +//// throw e; + }catch(Exception e){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("银行卡校验失败,-"+e.getMessage()); + rtn.getErrorList().add("银行卡校验失败,-"+e.getMessage()); + return true; + } + return false; + } + + /** + * 获取服务费率(除100后的) + * @author 张涛 + * @date 2021年12月1日 + * @param rate 服务费率 + * @return + */ + private BigDecimal getServiceChargeRate(BigDecimal rate) { + String str = rate.doubleValue()+""; + int retainNum = 2; + if (str.indexOf(".") != -1) { + String scaleStr = str.substring(str.indexOf(".")+1); + if(Long.parseLong(scaleStr) > 0) { + retainNum = retainNum + scaleStr.length(); + } + } + return rate.divide(new BigDecimal(100), retainNum,RoundingMode.HALF_UP); + } + + /** + * 获取账单批次号 + * @param merNo 商户编号(A10049-B10070-M11312,运营商编号-代理商编号-商户编号) + * @param billNo 填写的批次号 + * @return + */ + private String getBillNo(String merNo,String billNo){ + String[] mns = merNo.split("-"); + return "P"+mns[mns.length -1]+billNo; + } + + /** + * 新增账单 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(AddBillBo bo) { +// MerBill add = MapstructUtils.convert(bo, MerBill.class); + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + if(busOperAndAgentAndMer == null){ + this.invalidationParamsException("非法请求"); + } + QueryWrapper qw = Wrappers.query(); + qw.eq("bus_type",bo.getBusType()); + qw.eq("pro_id",bo.getProId()); + qw.eq("syd_id",bo.getSydId()); + qw.eq("mer_id",bo.getMerId()); + qw.eq("pro_status",1); + BusMerchantProduct bmp = this.busMerchantProductMapper.selectOne(qw); + + if(bmp == null){ + this.invalidationParamsException("非法请求"); + } + + bo.setServiceChargeRate(bmp.getServiceCharge()); + + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + + MerBill add = BeanUtil.copyProperties(bo, MerBill.class); + add.setVerifyStatus(1L); + add.setMoney(0l); + add.setServiceChargeAmount(0l); + add.setAmountEnt(0l); + add.setDetailCount(0l); + for (MerBillDetailBo detail: + bo.getDetails()) { + add.setMoney(add.getMoney()+detail.getMoney()); + add.setServiceChargeAmount(add.getServiceChargeAmount()+detail.getServiceChargeMoney()); + add.setAmountEnt(add.getAmountEnt()+detail.getServiceChargeMoney()+detail.getAmount()); + add.setDetailCount(add.getDetailCount()+1); + } + validEntityBeforeSave(add); + if(merchantAccountService.updateFrozen(add.getSydId(),add.getMerId(),add.getAmountEnt(),add.getPassage()) == 0){ + throw new ServiceException(add.getPassage()+"账户可用余额不足!"); + } + if(StringUtils.isNotBlank(bo.getNo())) { + add.setNo(getBillNo(bo.getMerNo(), bo.getNo())); + }else{ + add.setNo(genBillNo(0,10,bo.getMerNo())); + } + add.setAddTime(new Date()); + SysSydConfig sydConfig = sydConfigMapper.selectOne(new LambdaQueryWrapper().eq(SysSydConfig::getSydId,bo.getSydId())); + if(sydConfig == null){ + sydConfig = new SysSydConfig(0); + } + add.setSydVerifyStatus(1); + if(sydConfig.getAutoApprove() == 1){ + //服务商自动审批 + add.setStatus(1L); + add.setSydVerifyStatus(3); + add.setSydVerifyBy("自动审批"); + add.setSydVerifyTime(add.getAddTime()); + } + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("代发提交失败!"); + } + //商户总费率 + BigDecimal sh_service_rate = getServiceChargeRate(bo.getServiceChargeRate()); + //服务商费率 + BigDecimal fws_service_rate = null; + //运营商费率 + BigDecimal yys_service_rate = null; + //孵化中心费率 + BigDecimal fhzx_service_rate = null; + Long fhzx_id = null; + //总监费率 + BigDecimal zj_service_rate = null; + Long zj_id = null; + //业务员费率 + BigDecimal ywy_service_rate = null; + Long ywy_id = null; + //查询代理商 + BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,bo.getChannelId())); + //查询代理商产品 + BusChannelProduct channelProduct = channelProductMapper.selectOne(new LambdaQueryWrapper().eq(BusChannelProduct::getChannelId,bo.getChannelId()).eq(BusChannelProduct::getProStatus,1).eq(BusChannelProduct::getProId,bo.getProId())); + //查询运营商产品 + BusOperatorProduct operatorProduct = operatorProductMapper.selectOne(new LambdaQueryWrapper().eq(BusOperatorProduct::getOpId,bo.getOpId()).eq(BusOperatorProduct::getProStatus,1).eq(BusOperatorProduct::getProId,bo.getProId())); + if(channel.getDwLevel() == 1){//1:孵化中心 + fhzx_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + fhzx_id = channel.getId(); + yys_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + }else if(channel.getDwLevel() == 2){//2:总监 + zj_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + zj_id = channel.getId(); + if(channel.getPId() != null && channel.getPId() > 0) { + fhzx_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fhzx_id = channel.getPId(); + } + yys_service_rate = getServiceChargeRate(operatorProduct.getServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + }else if(channel.getDwLevel() == 3){//3:业务员 + ywy_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + ywy_id = channel.getId(); + if(channel.getPId() != null && channel.getPId() > 0) { + //上级代理商 + BusChannel upChannel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,channel.getPId())); + if(upChannel.getDwLevel() == 2) {//2:总监 + zj_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + zj_id = upChannel.getId(); + if(upChannel.getPId() != null && upChannel.getPId() > 0) { + BusChannelProduct zjChannelProduct = channelProductMapper.selectOne(new LambdaQueryWrapper().eq(BusChannelProduct::getChannelId, channel.getPId()).eq(BusChannelProduct::getProStatus, 1).eq(BusChannelProduct::getProId,bo.getProId())); + if(zjChannelProduct != null){ + fhzx_service_rate = getServiceChargeRate(zjChannelProduct.getCostServiceCharge()); + fhzx_id = upChannel.getPId(); + } + + } + }else if(upChannel.getDwLevel() == 1){//1:孵化中心 + fhzx_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fhzx_id = upChannel.getId(); + } + } + yys_service_rate = getServiceChargeRate(operatorProduct.getServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + } + List details = new ArrayList<>(); + List cnos = new ArrayList<>();//已存在的子项目编号列表 + MerTaskVo taskVo = taskMapper.selectVoById(bo.getTaskId()); + for (MerBillDetailBo detail: + bo.getDetails()) { + detail.setId(null); + MerBillDetail d = MapstructUtils.convert(detail,MerBillDetail.class); + d.setPassage(bo.getPassage()); + + if(d.getWorkerEnrollId() != null && StringUtils.isBlank(d.getCno())){ + throw new ServiceException("项目子编码不能为空"); + } + if(d.getWorkerEnrollId() == null){ + d.setCno(genBillDetailCNo(0,10,cnos)); + cnos.add(d.getCno()); + MerTaskEnroll enroll = new MerTaskEnroll(d.getCno(),taskVo.getNo(),taskVo.getClassify(),taskVo.getId(),d.getWorkerId(),3l,bo.getAddBy(),new Date()); + enroll.setCost(d.getMoney()); + taskEnrollMapper.insert(enroll); + d.setWorkerEnrollId(enroll.getId()); + } + String[] mns = bo.getMerNo().split("-"); + d.setBusNo("T"+mns[mns.length - 1]+IdUtil.getSnowflakeNextIdStr()); + d.setBillNo(add.getNo()); + d.setBillId(add.getId()); + d.setAddTime(add.getAddTime()); + d.setPassage(bo.getPassage()); + d.setTaskId(bo.getTaskId()); + d.setTaskNo(bo.getTaskNo()); + d.bind(bo); + d.setBusType(bo.getBusType()); + d.setProNo(bo.getProNo()); + d.setChargeMode(bo.getChargeMode()); + //平台分润(元)=(运营商费率-服务商费率)*代发金额,四舍五入 + d.setPtServiceChargeMoney(MoneyUtils.getMoneyFen(yys_service_rate.subtract(fws_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + log.info(d.getBusNo()+"平台费率计算:"+yys_service_rate+","+fws_service_rate+","+MoneyUtils.getMoneyYuan(d.getMoney())+"結果:"+d.getPtServiceChargeMoney()); + //服务商分润(元)=商户总服务费-平台服务费-运营商总分润 + //服务商分润(元)=(服务商费率)*代发金额,四舍五入 + d.setSydServiceChargeMoney(MoneyUtils.getMoneyFen(fws_service_rate.multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + log.info(d.getBusNo()+"服务商费率计算:"+fws_service_rate+",结果:"+d.getSydServiceChargeMoney()); +// d.setSydServiceChargeMoney(d.getServiceChargeMoney()-d.getPtServiceChargeMoney()-MoneyUtils.getMoneyFen(yyszServiceChargeMoney)); + //运营商总分润(元)=(商户总费率-运营商费率)*代发金额,向上取整 + //运营商总分润(元)=商户总服务费-平台服务费-服务商总分润, +// BigDecimal yyszServiceChargeMoney = sh_service_rate.subtract(yys_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.CEILING); + BigDecimal yyszServiceChargeMoney = MoneyUtils.getMoneyYuan(d.getServiceChargeMoney()-d.getPtServiceChargeMoney()-d.getSydServiceChargeMoney()); + log.info(d.getBusNo()+"运营商总分润计算:"+yyszServiceChargeMoney); + d.setSydServiceChargeRate(fws_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if(fhzx_service_rate != null) { + d.setFhzxChannelId(fhzx_id); + d.setFhzxServiceChargeRate(fhzx_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if (zj_service_rate == null) { + if(ywy_service_rate != null){ + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(ywy_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + }else{ + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + + } else { + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(zj_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + }else{ + d.setFhzxServiceChargeMoney(0l); + } + if(zj_service_rate != null) { + d.setZjChannelId(zj_id); + d.setZjServiceChargeRate(zj_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if (ywy_service_rate == null) { + d.setZjServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(zj_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } else { + d.setZjServiceChargeMoney(MoneyUtils.getMoneyFen(ywy_service_rate.subtract(zj_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + }else{ + d.setZjServiceChargeMoney(0l); + } + if(ywy_service_rate != null) { + d.setYwyChannelId(ywy_id); + d.setYwyServiceChargeRate(ywy_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + d.setYwyServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(ywy_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + }else{ + d.setYwyServiceChargeMoney(0l); + } + d.setShServiceChargeRate(sh_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + //运营商分润=运营商总分润-孵化中心收益-总监收益-业务员收益 + d.setOpServiceChargeMoney(MoneyUtils.getMoneyFen(yyszServiceChargeMoney)-d.getFhzxServiceChargeMoney()-d.getZjServiceChargeMoney()-d.getYwyServiceChargeMoney()); + d.setOpServiceChargeMoney(d.getOpServiceChargeMoney() < 0 ? 0 :d.getOpServiceChargeMoney()); + d.setOpServiceChargeRate(yys_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); +// d.setFhzxServiceChargeRate(fws_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + details.add(d); + } + billDetailMapper.insertBatch(details); + reProductInvoiceMapper.allocProduct(Arrays.asList(add.getProId()),Arrays.asList(add.getMerId()), BusRole.MERCHANT.getId(),add.getId(),11,add.getCreateBy(),new Date()); + List operLogs = new ArrayList<>();//操作日志 + operLogs.add(new BusOperLog("商户提交打款指令", BusRole.MERCHANT,add.getId(),BusLogType.BILL.getId())); + if(add.getSydVerifyStatus() != null){ + operLogs.add(new BusOperLog("服务商已接单", BusRole.SERVICE,add.getId(),BusLogType.BILL.getId())); + } + operLogMapper.insertBatch(operLogs); + return flag; + } + + /** + * 生成代发明细项目子编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @param exists 已生成的项目子编号 + * @return + */ + public String genBillDetailCNo(int retry,int maxRetry,List exists){ + String no = "ST"+RandomUtil.randomNumbers(11); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerBillDetail::getCno,no); + MerBillDetail exist = billDetailMapper.selectOne(lqw); + if(exist != null){ + if(retry > maxRetry){ + throw new ServiceException("项目子编号生成出错"); + }else { + no = genBillDetailCNo(retry + 1,maxRetry,exists); + } + }else if(exists != null && exists.contains(no)){ + no = genBillDetailCNo(retry + 1,maxRetry,exists); + } + return no; + } + + + public void validateSysSyd(AddBillBo bo){ + SysSydVo sydVo = this.sydMapper.selectVoById(bo.getSydId()); + if(sydVo == null){ + this.invalidationParamsException("无效服务商!"); + } + if(!(sydVo.getStatus() != null && sydVo.getStatus().intValue() == 1)){ + this.invalidationParamsException("服务商停止接单"); + } + } + + /** + * 修改账单 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(MerBillBo bo) { + MerBill update = MapstructUtils.convert(bo, MerBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean orderApproval(MerBillBo bo) { + MerBill bill = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getId,bo.getId())); + if(bill.getSydVerifyStatus() != 1){ + throw new ServiceException("该代发批次已审核,无法重复审核!"); + } + MerBill update = MapstructUtils.convert(bo, MerBill.class); + update.setSydVerifyTime(new Date()); + if(bo.getSydVerifyStatus() == 2) {//拒绝 + update.setStatus(5l); + //解冻代发金额 + if(merchantAccountMapper.updateFrozen(bill.getSydId(),bill.getMerId(),-bill.getAmountEnt(),bill.getPassage()) == 0){ + throw new ServiceException("商户余额解冻失败,请检查该代发批次是否已拒单!"); + } + operLogMapper.insert(new BusOperLog("服务商已拒单", BusRole.SERVICE,bo.getId(),BusLogType.BILL.getId())); + }else if(bo.getSydVerifyStatus() == 3) {//通过 + update.setStatus(1l); + operLogMapper.insert(new BusOperLog("服务商已接单", BusRole.SERVICE,bo.getId(),BusLogType.BILL.getId())); + } + return baseMapper.updateById(update) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentApproval(MerBillBo bo) { + MerBill bill = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getId,bo.getId())); + if(bill.getVerifyStatus() != 1){ + throw new ServiceException("该代发批次已审批,无法重复审批!"); + } + MerBill update = MapstructUtils.convert(bo, MerBill.class); + update.setVerifyTime(new Date()); + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,bill.getMerId())); + if(bo.getVerifyStatus() == 2) {//拒绝 + update.setStatus(4l); + //解冻代发金额 + if(merchantAccountService.updateFrozen(bill.getSydId(),bill.getMerId(),-bill.getAmountEnt(),bill.getPassage()) == 0){ + throw new ServiceException("余额解冻失败,请检查该代发批次是否已撤消!"); + } + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .set(MerBillDetail::getPayStatus,4) + .set(MerBillDetail::getChannelHalveStatus,4));//取消 + operLogMapper.insert(new BusOperLog("商户拒绝出款", BusRole.MERCHANT,bo.getId(),BusLogType.BILL.getId())); + }else if(bo.getVerifyStatus() == 3) {//通过 + if(StringUtils.isBlank(bo.getPassword())){ + throw new ServiceException("支付密码不为能空"); + } + checkPayPassword(BusRole.MERCHANT, bill.getMerId(), () -> { + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + update.setStatus(2l); + update.setGiveUpBy(update.getVerifyBy()); + update.setGiveUpTime(update.getVerifyTime()); + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .eq(MerBillDetail::getPayStatus,0) + .set(MerBillDetail::getPayStatus,3));//支付中 + operLogMapper.insert(new BusOperLog("商户提交出款指令", BusRole.MERCHANT,bo.getId(),BusLogType.BILL.getId())); + } + + SysSyd sysSyd = sydMapper.selectSysSydById(bill.getSydId()); + MerTask merTask = taskMapper.selectById(bill.getTaskId()); + BusMerchantAccount account = merchantAccountMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantAccount::getMerId,bill.getMerId()).eq(BusMerchantAccount::getSydId,bill.getSydId()).eq(BusMerchantAccount::getBankType,bill.getPassage()).eq(BusMerchantAccount::getStatus,1)); + List merBillDetails = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId())); + if(false){ + return xyjService.settleBatch(bill, merBillDetails, sysSyd, merchant, merTask, account); + }else{ + return baseMapper.updateById(update) > 0; + } + + } + + /** + * 验证支付密码 + */ + @Override + public Boolean checkPayPassword(BusRole role,long busId, Supplier supplier) { + String errorKey = "pwd_err_cnt:"+ role.getId() + ":" + busId; + Integer maxRetryCount = payPasswordProperties.getMaxRetryCount(); + Integer lockTime = payPasswordProperties.getLockTime(); + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + throw new ServiceException("密码输入错误"+maxRetryCount+"次,帐户锁定"+lockTime+"分钟"); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定 + if (errorNumber >= maxRetryCount) { + throw new ServiceException("密码输入错误"+maxRetryCount+"次,帐户锁定"+lockTime+"分钟"); + } else { + // 未达到规定错误次数 + throw new ServiceException("密码错误,剩余"+(maxRetryCount - errorNumber)+"次输入机会!"); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerBill entity){ + //TODO 做一些数据校验,如唯一约束 + MerBill exist = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getNo,getBillNo(entity.getMerNo(),entity.getNo()))); + if(exist != null){ + throw new ServiceException("批次号重复,请勿重复提交!"); + } + BusMerchantAccount account = merchantAccountMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantAccount::getMerId,entity.getMerId()).eq(BusMerchantAccount::getSydId,entity.getSydId()).eq(BusMerchantAccount::getBankType,entity.getPassage()).eq(BusMerchantAccount::getStatus,1)); + if(account == null){ + throw new ServiceException(entity.getPassage()+"账户未开通!"); + } + if(account.getBalance()-account.getFrozen() ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToService(int billId) { + MerBill bill = baseMapper.selectById(billId); + String busDesc = "转账到服务商"; + if (bill == null) { + String msg = "代发批次不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + if (bill.getStatus().intValue() == 4) { + String msg = "代发批次已取消"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + + if (bill.getStatus().intValue() == 3) { + String msg = "代发批次已支付"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + List accs = merchantAccountMapper.selectByMerIdAndSydId(bill.getSydId(), bill.getMerId(),bill.getPassage()); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + MerBill upd = new MerBill(); + upd.setId(bill.getId()); + upd.setStatus(3l); + upd.setPayStatus(2l); + upd.setPayTime(new Date()); + baseMapper.updateById(upd); + return false; + } + if (accs.size() == 0) { + String msg = "商户"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId()+")"); + } + if (accs.get(0).getFrozen() < bill.getAmountEnt()) { + String msg = "商户"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //商户转账到服务商B2B + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(1l); + backLog.setTranNo("TR1"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(accs.get(0).getAccId().intValue(), sydAccs.get(0).getAccId().intValue(),bill.getAmountEnt(), bill.getNo(), "B2B转账"); + String msg = "发送交易申请失败"; + if (backRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.MERCHANT.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.SERVICE.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .eq(MerBillDetail::getPayStatus,3) + .set(MerBillDetail::getSydHalveStatus,3));//支付中 + operLogMapper.insert(new BusOperLog("企业转账服务商", BusRole.MERCHANT,bill.getId(),BusLogType.BILL.getId())); + } + return true; + } + + /** + * 服务商转账到运营商 + * @param bill + * @return + */ + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToOperator(MerBillVo bill) { + if (bill == null) { + throw new ServiceException("服务商转账到运营商,代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException("服务商转账到运营商,代发批次已取消("+bill.getId()+")"); + } + + if (bill.getStatus().intValue() == 3) { + throw new ServiceException("服务商转账到运营商,代发批次已支付("+bill.getId()+")"); + } + BusOperatorAccountVo accs = operatorAccountMapper.selectVoOne(new LambdaQueryWrapper() + .eq(BusOperatorAccount::getSydId,bill.getSydId()) + .eq(BusOperatorAccount::getOpId,bill.getOpId()) + .eq(BusOperatorAccount::getBankType,bill.getPassage()) + .eq(BusOperatorAccount::getIsDefault,1)); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + throw new ServiceException("服务商转账到运营商,代发明细不存在("+bill.getId()+")"); + } + if (accs == null) { + String msg = "运营商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId().intValue() +"," + bill.getOpId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId().intValue()+")"); + } + + //运营商总分润(分) + Long sumOpServiceChargeMoney = 0l; + for (MerBillDetailVo detail:details) { + sumOpServiceChargeMoney += detail.getOpServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getFhzxServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getZjServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getYwyServiceChargeMoney(); + } + if (sydAccs.get(0).getFrozen() < sumOpServiceChargeMoney) { + String msg = "服务商"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //服务商转账到运营商 + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(2l); + backLog.setTranNo("T2"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), accs.getAccId().intValue(),sumOpServiceChargeMoney, bill.getNo(), "渠道推广费"); + if (backRtn.hasError()) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.OPERATOR.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getOpHalveStatus, 3));//支付中 + operLogMapper.insert(new BusOperLog("服务商转账运营商", BusRole.SERVICE,bill.getId(),BusLogType.BILL.getId())); + } + return true; + } + + /** + * 服务商转账到平台 + * @param bill + * @return + */ + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToPlatform(MerBillVo bill) { + String busDesc = "服务商转账到平台"; + if (bill == null) { + throw new ServiceException(busDesc+",代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException(busDesc+",代发批次已取消("+bill.getId()+")"); + } + + if (bill.getStatus().intValue() == 3) { + throw new ServiceException(busDesc+",代发批次已支付("+bill.getId()+")"); + } + BusAccountsVo accs = accountsMapper.selectVoOne(new LambdaQueryWrapper() + .eq(BusAccounts::getSydId,bill.getSydId()) + .eq(BusAccounts::getUnitId,0) + .eq(BusAccounts::getBankType,bill.getPassage()) + .eq(BusAccounts::getIsDefault,1)); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + throw new ServiceException(busDesc+",代发明细不存在("+bill.getId()+")"); + } + if (accs == null) { + String msg = "平台"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getOpId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId()+")"); + } + //平台分润(分) + Long ptServiceChargeMoney = details.stream().mapToLong(MerBillDetailVo::getPtServiceChargeMoney).sum(); + if (sydAccs.get(0).getFrozen() < ptServiceChargeMoney) { + String msg = "服务商"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //服务商转账到运营商 + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(3l); + backLog.setTranNo("TR5"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), accs.getAccId().intValue(),ptServiceChargeMoney, bill.getNo(), "技术服务费"); + if (backRtn.hasError()) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.PLATFORM.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getPtHalveStatus, 3));//支付中 + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToWorkers(MerBillVo bill) { + if (bill == null) { + throw new ServiceException("代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException("代发批次已取消("+bill.getId()+")"); + } + if (bill.getStatus().intValue() == 3) { + throw new ServiceException("代发批次已支付("+bill.getId()+")"); + } + List details = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + for (MerBillDetail billDetail: + details) { + singlePaymentToWorker(billDetail); + } + operLogMapper.insert(new BusOperLog("B2C代发", BusRole.MERCHANT,bill.getId(),BusLogType.BILL.getId())); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToWorker(int billDetailId) { + MerBillDetail billDetail = billDetailMapper.selectById(billDetailId); + return singlePaymentToWorker(billDetail); + } + + @Transactional(rollbackFor = Exception.class) + public Boolean singlePaymentToWorker(MerBillDetail billDetail) { + String busDesc = "服务商转账到个人B2C"; + if (billDetail == null) { + String msg = "代发批次明细不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg); + } + if (billDetail.getPayStatus() == 4) { + String msg = "代发批次明细已取消"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billDetail.getId()+")"); + } + if (billDetail.getPayStatus() != 0 && billDetail.getPayStatus() != 2 && billDetail.getPayStatus() != 3) { + String msg = "代发批次明细已支付或支付中"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billDetail.getId()+")"); + } + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(billDetail.getSydId(),null,billDetail.getPassage()); + if (sydAccs.size() == 0) { + String msg = "服务商"+billDetail.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId().intValue()+")"); + } + if(billDetail.getWorkerId() == 0 && billDetail.getIsOut() == 1) {//开放平台-付款账户 + Account bankAcc = new Account(); + bankAcc.setBankType(StringUtils.isNotBlank(billDetail.getBankType()) ? billDetail.getBankType() : "开放平台"); + bankAcc.setBankCard(billDetail.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(billDetail.getWorkerName()); + bankAcc.setType((short)2);//2:真实个人账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getId,billDetail.getId()) + .set(MerBillDetail::getBankAccId,addRtn.getRtnData().getId())); + billDetail.setBankAccId(addRtn.getRtnData().getId()); + } + //服务商转账到个人B2C + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(4l); + String no = DateUtils.dateTimeNow(DateUtils.YYYYMMDDHHMMSSSSS)+billDetail.getId(); + int randomLength = 22 - no.length(); + if(randomLength > 0){ + no += RandomUtil.randomNumbers(randomLength); + } + backLog.setTranNo(no); + backLog.setBuisId(billDetail.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,"-1,1,2").size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), billDetail.getBankAccId(),billDetail.getAmount(), billDetail.getBusNo(), "B2C转账"); + String msg = "发送交易申请失败"; + if (backRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.WORKER.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId, billDetail.getWorkerEnrollId()) + .set(MerTaskEnroll::getSettlementStatus, 2));//结算中 + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog billTransaction(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + if (tran.getResult().intValue() == 2) {//支付成功 + if(tlog.getBusItem() == 4){//服务商转账到个人B2C + String busDesc = "服务商转账到个人B2C"; + MerBillDetail billDetail = billDetailMapper.selectById(tlog.getBuisId()); + if (billDetail == null) { + throw new ServiceException(busDesc+"时,账单详情不存在("+tlog.getBuisId()+")"); + } + if(billDetail.getPayStatus() != 3){ + //非支付中,直接返回 + return null; + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId, billDetail.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getPayStatus, 1) + .set(MerBillDetail::getPayTime, new Date())) == 0){ + throw new ServiceException(busDesc+"时,已代发或已取消("+tlog.getBuisId()+")"); + } + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + //已结算 + if(taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId, billDetail.getWorkerEnrollId()) + .eq(MerTaskEnroll::getSettlementStatus,2) + .set(MerTaskEnroll::getSettlementStatus, 1)) == 0){ + throw new ServiceException(busDesc+"时,已结算或已取消("+tlog.getBuisId()+","+billDetail.getWorkerEnrollId()+")"); + } + } + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+billDetail.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+billDetail.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + MerBillVo bill = baseMapper.selectVoById(billDetail.getBillId()); + SysSydVo syd = sydMapper.selectVoById(bill.getSydId()); + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),1, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"B2C转账", bill.getNo(), bill.getId(), billDetail.getId(), tlog.getTranNo(), 2, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), billDetail.getWorkerId(), tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 2); + sydFlowsMapper.insertSelective(sydFlow); + billDetailService.billResult(bill.getId()); + }else{ + MerBillVo bill = baseMapper.selectVoById(tlog.getBuisId()); + if(bill == null){ + throw new ServiceException("服务商B2B时,代发批次不存在("+tlog.getBuisId()+")"); + } + if(bill.getStatus() != 2){ + //非发放中,直接返回 + return null; + } + SysSydVo syd = sydMapper.selectVoById(bill.getSydId()); + if(tlog.getBusItem() == 1){//商户转账到服务商B2B + if(merchantAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("商户转账到服务商B2B时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(merchantAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("商户转账到服务商B2B时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getSydHalveStatus, 3) + .set(MerBillDetail::getSydHalveStatus, 1)) == 0){ + throw new ServiceException("商户转账到服务商B2B时,非支付中("+tlog.getBuisId()+")"); + } + BusMerchantVo merchant = merchantMapper.selectVoById(bill.getMerId()); + BusMerchantFlows merchantFlow = new BusMerchantFlows(2,bill.getMerId(),bill.getSydId(),5, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"B2B转账", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getMerId(), merchant.getName(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), bill.getSydId(), syd.getGsmc(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1, ""); + merchantFlowsMapper.insertAll(Arrays.asList(merchantFlow)); + sydAccountService.updateBalanceByAccId(tran.getTargetAccId(),tran.getAmount()); + sydAccountService.updateFrozenByAccId(tran.getTargetAccId(),tran.getAmount()); + sydFlowsMapper.insertSelective(new SysSydFlows(1,bill.getSydId(),merchantFlow.getBusType(),merchantFlow.getChannel(),merchantFlow.getBusNo(),merchantFlow.getBankNo(),tran.getAmount(),merchantFlow.getAddTime(),merchantFlow.getAddBy(),merchantFlow.getBusDesc(),merchantFlow.getBillNo(),merchantFlow.getBillId(),merchantFlow.getBillDetailId(),merchantFlow.getTranNo(),merchantFlow.getTranType(),merchantFlow.getTranStatus(),merchantFlow.getPayerType(),merchantFlow.getPayerId(),merchantFlow.getPayerName(),merchantFlow.getPayerAcc(),merchantFlow.getPayerAccId(),merchantFlow.getPayeeType(),merchantFlow.getPayeeId(),merchantFlow.getPayeeName(),merchantFlow.getPayeeAcc(),merchantFlow.getPayeeAccId(),merchantFlow.getBillNo(),merchantFlow.getPayReceiptType())); + paymentToOperator(bill); + }else if(tlog.getBusItem() == 2){//服务商转账到运营商 + BusOperatorVo operatorVo = operatorMapper.selectVoById(bill.getOpId()); + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到运营商时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到运营商时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getOpHalveStatus, 3) + .set(MerBillDetail::getOpHalveStatus, 1) + .set(MerBillDetail::getChannelHalveStatus,3)) == 0){ + throw new ServiceException("服务商转账到运营商时,非支付中("+tlog.getBuisId()+")"); + } + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),4, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"渠道推广费", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), bill.getOpId(), operatorVo.getName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + sydFlowsMapper.insertSelective(sydFlow); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + //运营商分润(分) + Long sumOpServiceChargeMoney = 0l; + //孵化中心收益(分) + Long sumFhzxServiceChargeMoney = 0l; + //总监收益(分) + Long sumZjServiceChargeMoney = 0l; + //业务员收益(分) + Long sumYwyServiceChargeMoney = 0l; + for(MerBillDetailVo detail : details){ + sumOpServiceChargeMoney += detail.getOpServiceChargeMoney(); + sumFhzxServiceChargeMoney += detail.getFhzxServiceChargeMoney(); + sumZjServiceChargeMoney += detail.getZjServiceChargeMoney(); + sumYwyServiceChargeMoney += detail.getYwyServiceChargeMoney(); + } + Long yysSumAll = sumOpServiceChargeMoney+sumFhzxServiceChargeMoney+sumZjServiceChargeMoney+sumYwyServiceChargeMoney; +// operatorAccountService.updateBalanceByAccId(tran.getTargetAccId(),sumOpServiceChargeMoney); +// operatorFlowsMapper.insertSelective(new BusOperatorFlows(1,bill.getOpId(),sydFlow.getBusType(),sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),sumOpServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayerType(),sydFlow.getPayerId(),sydFlow.getPayerName(),sydFlow.getPayerAcc(),sydFlow.getPayerAccId(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),sydFlow.getBillNo(),sydFlow.getPayReceiptType())); +// operatorAccountService.updateFrozenByAccId(tran.getTargetAccId(),sumOpServiceChargeMoney); +// operatorFlowsMapper.insertSelective(new BusOperatorFlows(0,bill.getOpId(),8,sydFlow.getChannel(),null,null,-sumOpServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),"F"+IdUtil.getSnowflakeNextIdStr(),5,sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),null,null,null,null,null,"",0)); + operatorAccountService.updateBalanceByAccId(tran.getTargetAccId(),yysSumAll); + operatorFlowsMapper.insertSelective(new BusOperatorFlows(1,bill.getOpId(),sydFlow.getBusType(),sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),yysSumAll,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayerType(),sydFlow.getPayerId(),sydFlow.getPayerName(),sydFlow.getPayerAcc(),sydFlow.getPayerAccId(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),sydFlow.getBillNo(),sydFlow.getPayReceiptType())); + operatorAccountService.updateFrozenByAccId(tran.getTargetAccId(),yysSumAll); + operatorFlowsMapper.insertSelective(new BusOperatorFlows(0,bill.getOpId(),8,sydFlow.getChannel(),null,null,-yysSumAll,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),"F"+IdUtil.getSnowflakeNextIdStr(),5,sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),null,null,null,null,null,"",0)); + if(sumFhzxServiceChargeMoney > 0) {//孵化中心收益 + Long channelId = details.get(0).getFhzxChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumFhzxServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumFhzxServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + if(sumZjServiceChargeMoney > 0) {//总监收益 + Long channelId = details.get(0).getZjChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumZjServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumZjServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumZjServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumZjServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + if(sumYwyServiceChargeMoney > 0) {//业务员收益 + Long channelId = details.get(0).getYwyChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumYwyServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumYwyServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumYwyServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumYwyServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + paymentToPlatform(bill); + }else if(tlog.getBusItem() == 3){//服务商转账到平台 + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到平台时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到平台时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getPtHalveStatus, 3) + .set(MerBillDetail::getPtHalveStatus, 1)) == 0){ + throw new ServiceException("服务商转账到平台时,非支付中("+tlog.getBuisId()+")"); + } + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),3, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"技术服务费", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + List details = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + //服务商分润(分) + Long sydServiceChargeMoney = details.stream().mapToLong(MerBillDetail::getSydServiceChargeMoney).sum(); + sydFlowsMapper.insertSelective(new SysSydFlows(0,bill.getSydId(),6, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -sydServiceChargeMoney, new Date(),bill.getAddBy(),"资金冻结", bill.getNo(), bill.getId(), null, "F"+ IdUtil.getSnowflakeNextIdStr(), 5, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), null, null, null, null, null, "", 0)); + sydFlowsMapper.insertSelective(sydFlow); + accountsMapper.updateBalanceByAccId(tran.getTargetAccId(),tran.getAmount()); + paymentToWorkers(bill); + } + } + save = new TranLog(tlog.getId(), 2); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(tlog.getBusItem() == 4) {//服务商转账到个人B2C + String busDesc = "服务商转账到个人B2C"; + MerBillDetail billDetail = billDetailMapper.selectById(tlog.getBuisId()); + if (billDetail == null) { + throw new ServiceException(busDesc+"失败时,代发批次明细不存在("+tlog.getBuisId()+")"); + } + billDetailService.failBillDetail(billDetail.getBillId(),billDetail.getId(),tran.getReason(),0,null); + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + }else { + //记录最后一次失败的时间 + save = new TranLog(tlog.getId(),null,new Date()); + } + } + } + return save; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean billTransactionCallback(TranLogVo tlog, String callback) { + if(tlog.getBusItem() == 1){//商户转账到服务商B2B + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId,tlog.getBuisId()) + .set(MerBillDetail::getPayReceiptB2b,callback)); + merchantFlowsMapper.update(new LambdaUpdateWrapper() + .eq(BusMerchantFlows::getTranNo,tlog.getTranNo()) + .set(BusMerchantFlows::getPayReceipt,callback)); + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 2){//服务商转账到运营商 + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + operatorFlowsMapper.update(new LambdaUpdateWrapper() + .eq(BusOperatorFlows::getTranNo,tlog.getTranNo()) + .set(BusOperatorFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 3){//服务商转账到平台 + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 4){//服务商转账到个人B2C + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,tlog.getBuisId()) + .set(MerBillDetail::getPayReceipt,callback)); + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java new file mode 100644 index 0000000..17e4f58 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java @@ -0,0 +1,139 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商账户 + * 前端访问路由地址为:/payment/channelAccount + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelAccount") +public class BusChannelAccountController extends BaseController { + + private final IBusChannelAccountService busChannelAccountService; + + private final IBusChannelService channelService; + + private void bindDataPermission(BusChannelAccountBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.getParams().putAll(Map.of("level_channel_no",loginUser.getBusNo())); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.setChannelId(loginUser.getBusId()); + } + } + + /** + * 查询代理商账户列表 + */ +// @SaCheckPermission("payment:channelAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelAccountBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + TableDataInfo rtn = busChannelAccountService.queryPageList(bo, pageQuery); +// if(rtn.getRows() != null && rtn.getRows().size() > 0){ +// BusChannelVo vo = channelService.queryById(loginUser.getBusId()); +// rtn.setRows(rtn.getRows().stream().peek(d -> d.setAccName(vo.getKhm())).collect(Collectors.toList())); +// } + return rtn; + } + + /** + * 导出代理商账户列表 + */ + @SaCheckPermission("payment:channelAccount:export") + @Log(title = "代理商账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelAccountBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busChannelAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商账户", BusChannelAccountVo.class, response); + } + + /** + * 获取代理商账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + + BusChannelAccountVo vo = busChannelAccountService.queryById(id); + BusChannelVo bc = this.channelService.queryById(LoginHelper.getBusId()); + vo.setBankCard(bc.getBankCard()); + return R.ok(vo); + } + + /** + * 新增代理商账户 + */ + @SaCheckPermission("payment:channelAccount:add") + @Log(title = "代理商账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelAccountBo bo) { + return toAjax(busChannelAccountService.insertByBo(bo)); + } + + /** + * 修改代理商账户 + */ + @SaCheckPermission("payment:channelAccount:edit") + @Log(title = "代理商账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelAccountBo bo) { + return toAjax(busChannelAccountService.updateByBo(bo)); + } + + /** + * 删除代理商账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelAccount:remove") + @Log(title = "代理商账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java new file mode 100644 index 0000000..7e4d9c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.payment.channel.service.IBusChannelAccountSynService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商账户同步记录 + * 前端访问路由地址为:/payment/channelAccountSyn + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelAccountSyn") +public class BusChannelAccountSynController extends BaseController { + + private final IBusChannelAccountSynService busChannelAccountSynService; + + /** + * 查询代理商账户同步记录列表 + */ + @SaCheckPermission("payment:channelAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelAccountSynBo bo, PageQuery pageQuery) { + return busChannelAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商账户同步记录列表 + */ + @SaCheckPermission("payment:channelAccountSyn:export") + @Log(title = "代理商账户同步记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelAccountSynBo bo, HttpServletResponse response) { + List list = busChannelAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商账户同步记录", BusChannelAccountSynVo.class, response); + } + + /** + * 获取代理商账户同步记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelAccountSynService.queryById(id)); + } + + /** + * 新增代理商账户同步记录 + */ + @SaCheckPermission("payment:channelAccountSyn:add") + @Log(title = "代理商账户同步记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelAccountSynBo bo) { + return toAjax(busChannelAccountSynService.insertByBo(bo)); + } + + /** + * 修改代理商账户同步记录 + */ + @SaCheckPermission("payment:channelAccountSyn:edit") + @Log(title = "代理商账户同步记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelAccountSynBo bo) { + return toAjax(busChannelAccountSynService.updateByBo(bo)); + } + + /** + * 删除代理商账户同步记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelAccountSyn:remove") + @Log(title = "代理商账户同步记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java new file mode 100644 index 0000000..86e53fa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java @@ -0,0 +1,160 @@ +package org.dromara.payment.channel.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 代理商提现记录 + * 前端访问路由地址为:/payment/channelCashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelCashout") +public class BusChannelCashoutController extends BaseController { + + private final IBusChannelCashoutService busChannelCashoutService; + + private final IBusChannelAccountService channelAccountService; + + private void bindDataPermission(BusChannelCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.setChannelId(loginUser.getBusId()); + } + } + + /** + * 查询代理商提现记录列表 + */ + @SaCheckPermission("payment:channelCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelCashoutBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return busChannelCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商提现记录列表 + */ + @SaCheckPermission("payment:channelCashout:export") + @Log(title = "代理商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelCashoutBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busChannelCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商提现记录", BusChannelCashoutVo.class, response); + } + + /** + * 获取代理商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelCashoutService.queryById(id)); + } + + /** + * 获取代理商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(channelAccountService.getCashoutAccount(id)); + } + + /** + * 新增代理商提现记录 + */ + @SaCheckPermission("payment:channelCashout:add") + @Log(title = "代理商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busChannelCashoutService.insertByBo(bo)); + } + + /** + * 审批代理商提现记录 + */ + @Log(title = "审批代理商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/verifyCashout") + public R verifyCashout(@Positive(message = "提现记录id无效") long id,@Positive(message = "审核是否通过无效") long verifyStatus,@NotBlank(message = "支付凭证不能为空") String invoicePic,String verifyReason) { + LoginUser loginUser = LoginHelper.getLoginUser(); + BusChannelCashoutBo bo = new BusChannelCashoutBo(); + bo.setId(id); + bo.setVerifyStatus(verifyStatus); + bo.setVerifyReason(verifyReason); + bo.setInvoicePic(invoicePic); + bo.setVerifyBy(loginUser.getNickname()); + return toAjax(busChannelCashoutService.verifyCashout(bo)); + } + + /** + * 修改代理商提现记录 + */ + @SaCheckPermission("payment:channelCashout:edit") + @Log(title = "代理商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelCashoutBo bo) { + return toAjax(busChannelCashoutService.updateByBo(bo)); + } + + /** + * 删除代理商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelCashout:remove") + @Log(title = "代理商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java new file mode 100644 index 0000000..6e2f8bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java @@ -0,0 +1,155 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商 + * 前端访问路由地址为:/payment/channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channel") +public class BusChannelController extends BaseController { + + private final IBusChannelService busChannelService; + + + + + /** + * 查询代理商列表 + */ + @SaCheckPermission("payment:channel:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelBo bo, PageQuery pageQuery) { + return busChannelService.queryPageList(bo, pageQuery); + } + + + /** + * 查询代理商列表 + */ +// @SaCheckPermission("payment:channel:listConfig") + @GetMapping("/listConfig") + public TableDataInfo listConfig(BusChannelBo bo, PageQuery pageQuery) { + return busChannelService.queryPageListProConfig(bo, pageQuery); + } + + /** + * 导出代理商列表 + */ + @SaCheckPermission("payment:channel:export") + @Log(title = "代理商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelBo bo, HttpServletResponse response) { + List list = busChannelService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商", BusChannelVo.class, response); + } + + /** + * 获取代理商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channel:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelService.queryById(id)); + } + + + + /** + * 获取代理商详细信息 + * + */ + @GetMapping("/getAgInfo") + @SaCheckPermission("payment:channel:getAgentInfo") + @Log(title = "根据登录用户获取代理商详情", businessType = BusinessType.SELECT) + public R getAgentInfo() { + return R.ok(busChannelService.getAgentInfo()); + } + + /** + * 新增代理商 + */ + @SaCheckPermission("payment:channel:add") + @Log(title = "代理商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelBo bo) { + return toAjax(busChannelService.insertByBo(bo)); + } + + /** + * 修改代理商 + */ + @SaCheckPermission("payment:channel:edit") + @Log(title = "代理商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelBo bo) { + return toAjax(busChannelService.updateByBo(bo)); + } + + /** + * 删除代理商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channel:remove") + @Log(title = "代理商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 审核代理商 + */ +// @SaCheckPermission("payment:channel:check") + @Log(title = "审核代理商", businessType = BusinessType.UPDATE) + @PostMapping("/chk") + @SaCheckPermission("payment:channel:check") + public R chk(Long chId,Long checkType,String reason,String domain) { + return R.ok(this.busChannelService.checkChannel(chId,checkType,reason,domain)); + } + + + @Log(title = "获取代理商的级别", businessType = BusinessType.UPDATE) + @GetMapping("/getDwLevel") + public R> getDwLevel(){ + return R.ok(this.busChannelService.getDwLevel()); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java new file mode 100644 index 0000000..1f99f8c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.payment.channel.service.IBusChannelFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商流水 + * 前端访问路由地址为:/payment/channelFlows + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelFlows") +public class BusChannelFlowsController extends BaseController { + + private final IBusChannelFlowsService busChannelFlowsService; + + /** + * 查询代理商流水列表 + */ + @SaCheckPermission("payment:channelFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelFlowsBo bo, PageQuery pageQuery) { + return busChannelFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商流水列表 + */ + @SaCheckPermission("payment:channelFlows:export") + @Log(title = "代理商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelFlowsBo bo, HttpServletResponse response) { + List list = busChannelFlowsService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商流水", BusChannelFlowsVo.class, response); + } + + /** + * 获取代理商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelFlowsService.queryById(id)); + } + + /** + * 新增代理商流水 + */ + @SaCheckPermission("payment:channelFlows:add") + @Log(title = "代理商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelFlowsBo bo) { + return toAjax(busChannelFlowsService.insertByBo(bo)); + } + + /** + * 修改代理商流水 + */ + @SaCheckPermission("payment:channelFlows:edit") + @Log(title = "代理商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelFlowsBo bo) { + return toAjax(busChannelFlowsService.updateByBo(bo)); + } + + /** + * 删除代理商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelFlows:remove") + @Log(title = "代理商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java new file mode 100644 index 0000000..be4fbea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java @@ -0,0 +1,107 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.service.IBusChannelProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商产品 + * 前端访问路由地址为:/payment/channelProduct + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelProduct") +public class BusChannelProductController extends BaseController { + + private final IBusChannelProductService busChannelProductService; + + /** + * 查询代理商产品列表 + */ +// @SaCheckPermission("payment:channelProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelProductBo bo, PageQuery pageQuery) { + return busChannelProductService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商产品列表 + */ + @SaCheckPermission("payment:channelProduct:export") + @Log(title = "代理商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelProductBo bo, HttpServletResponse response) { + List list = busChannelProductService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商产品", BusChannelProductVo.class, response); + } + + /** + * 获取代理商产品详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelProductService.queryById(id)); + } + + /** + * 新增代理商产品 + */ + @SaCheckPermission("payment:channelProduct:add") + @Log(title = "代理商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody JSONObject json ) { + return toAjax(busChannelProductService.insertByBo(json)); + } + + /** + * 修改代理商产品 + */ + @SaCheckPermission("payment:channelProduct:edit") + @Log(title = "代理商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelProductBo bo) { + return toAjax(busChannelProductService.updateByBo(bo)); + } + + /** + * 删除代理商产品 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelProduct:remove") + @Log(title = "代理商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelProductService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java new file mode 100644 index 0000000..e6b6be1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java @@ -0,0 +1,132 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.channel.mapper.BusChannelSalesmanMapper; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.service.IBusChannelSalesmanService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商业务员 + * 前端访问路由地址为:/payment/channelSalesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelSalesman") +public class BusChannelSalesmanController extends BaseController { + + private final IBusChannelSalesmanService busChannelSalesmanService; + + private final BusChannelSalesmanMapper salesmanMapper; + + + + @RequestMapping("/test") + public R test(){ + R.ok(salesmanMapper.selectDataTest()); + return this.toAjax(1); + } + + /** + * 查询代理商业务员列表 + */ + @SaCheckPermission("payment:channelSalesman:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelSalesmanBo bo, PageQuery pageQuery) { + return busChannelSalesmanService.selectSaleMans(bo, pageQuery); + } + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 11:41 + * 说明: 查询业务员集合不分页 + **/ + @GetMapping("/ywyList") + @SaCheckPermission("payment:channelSalesman:ywyList") + public R> list(BusChannelSalesmanBo bo) { + return R.ok(busChannelSalesmanService.queryList(bo)); + } + + + /** + * 导出代理商业务员列表 + */ + @SaCheckPermission("payment:channelSalesman:export") + @Log(title = "代理商业务员", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelSalesmanBo bo, HttpServletResponse response) { + List list = busChannelSalesmanService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商业务员", BusChannelSalesmanVo.class, response); + } + + /** + * 获取代理商业务员详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelSalesman:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelSalesmanService.queryById(id)); + } + + /** + * 新增代理商业务员 + */ + @SaCheckPermission("payment:channelSalesman:add") + @Log(title = "代理商业务员", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) BusChannelSalesmanBo bo) { + return toAjax(busChannelSalesmanService.insertByBo(bo)); + } + + /** + * 修改代理商业务员 + */ + @SaCheckPermission("payment:channelSalesman:edit") + @Log(title = "代理商业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) BusChannelSalesmanBo bo) { + return toAjax(busChannelSalesmanService.updateByBo(bo)); + } + + /** + * 删除代理商业务员 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelSalesman:remove") + @Log(title = "代理商业务员", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelSalesmanService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java new file mode 100644 index 0000000..2758a46 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java @@ -0,0 +1,208 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel") +public class BusChannel extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 代理商名称 + */ + private String name; + + /** + * 代理商级别(1:孵化中心 2:总监 3:业务员) + */ + private Integer dwLevel; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + private String operatorNo; + + + private String yyzz; + + private String khxkz ; + + private String payPassword; + + private Long createUnitId; + + private String createUnitNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java new file mode 100644 index 0000000..376f527 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商账户对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_account") +public class BusChannelAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 总收益(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + private Integer isDefault; + + /** + * 昨日收益(分) + */ + private Long yesterday; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 昨天收益统计开始时间 + */ + private transient String flowsBeginTime; + + /** + * 昨天收益统计结束时间 + */ + private transient String flowsEndTime; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java new file mode 100644 index 0000000..9b4131e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 代理商账户同步记录对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_account_syn") +public class BusChannelAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java new file mode 100644 index 0000000..c6010f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java @@ -0,0 +1,150 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商提现记录对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_cashout") +public class BusChannelCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + + private String channelNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java new file mode 100644 index 0000000..a82fff2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java @@ -0,0 +1,181 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商流水对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_flows") +public class BusChannelFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusChannelFlows(){} + + public BusChannelFlows(Integer direction,Long channelId, Integer busType, String busNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, Integer tranType, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark) { + this.channelId = channelId; + this.busType = busType; + this.busNo = busNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranType = tranType; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java new file mode 100644 index 0000000..9a76e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java @@ -0,0 +1,122 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 代理商产品对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_product") +public class BusChannelProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + + + @TableField(exist = false) + private Long createDept; + + private Integer upIsOp; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java new file mode 100644 index 0000000..e93ea0e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java @@ -0,0 +1,63 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商业务员对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_salesman") +public class BusChannelSalesman extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 业务员名称 + */ + private String name; + + /** + * 业务员编号 + */ + private String no; + + + private String remarker; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java new file mode 100644 index 0000000..dddd252 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商账户业务对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelAccount.class, reverseConvertGenerate = false) +public class BusChannelAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型 + */ + @NotBlank(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 总收益(分) + */ + @NotNull(message = "总收益(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额(分) + */ + @NotNull(message = "冻结金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 已提现金额(分) + */ + @NotNull(message = "已提现金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isDefault; + + /** + * 昨日收益(分) + */ + @NotNull(message = "昨日收益(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yesterday; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java new file mode 100644 index 0000000..47b1f75 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 代理商账户同步记录业务对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelAccountSyn.class, reverseConvertGenerate = false) +public class BusChannelAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java new file mode 100644 index 0000000..3cf3c29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java @@ -0,0 +1,235 @@ +package org.dromara.payment.channel.domain.bo; + +import cn.hutool.core.date.DateUtil; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 代理商业务对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannel.class, reverseConvertGenerate = false) +public class BusChannelBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + @NotNull(message = "代理商类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer dwType; + + /** + * 代理商名称 + */ + @NotBlank(message = "代理商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人身份证 + */ +// @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户账号 + */ + @NotBlank(message = "开户账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 银行卡正面 + */ +// @NotBlank(message = "银行卡正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ +// @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return endTime; + } + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + + private String yyzz; + + private String khxkz ; + + private Integer dwLevel; + + private Long createUnitId; + + private String createUnitNo; + + private Integer isProduct; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java new file mode 100644 index 0000000..8c1d8e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java @@ -0,0 +1,153 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商提现记录业务对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelCashout.class, reverseConvertGenerate = false) +public class BusChannelCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + @NotNull(message = "代理商账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ +// @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java new file mode 100644 index 0000000..9a70d10 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java @@ -0,0 +1,170 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商流水业务对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelFlows.class, reverseConvertGenerate = false) +public class BusChannelFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java new file mode 100644 index 0000000..8ac6113 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java @@ -0,0 +1,137 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 代理商产品业务对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelProduct.class, reverseConvertGenerate = false) +public class BusChannelProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 运营商服务费率(%) + */ + @NotNull(message = "运营商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ +// @NotNull(message = "代理商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ +// @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + + private Long chId; + + private Integer upIsOp; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java new file mode 100644 index 0000000..28700f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 代理商业务员业务对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelSalesman.class, reverseConvertGenerate = false) +public class BusChannelSalesmanBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + //代理商名称 + private String channelName; + + /** + * 业务员名称 + */ + @NotNull(message = "业务员名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + + private Date createTime; + + + + /** + * 业务员编号 + */ + private String no; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String remarker; + + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java new file mode 100644 index 0000000..a667eb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelAccountSynVo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商账户同步记录Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelAccountSynVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java new file mode 100644 index 0000000..a65621c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商账户Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java new file mode 100644 index 0000000..ec83107 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelCashoutVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商提现记录Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java new file mode 100644 index 0000000..342e01d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelFlowsVo; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商流水Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java new file mode 100644 index 0000000..2370304 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelProductVo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商产品Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java new file mode 100644 index 0000000..72b4e29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelSalesmanVo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商业务员Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelSalesmanVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java new file mode 100644 index 0000000..cb625cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelVo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java new file mode 100644 index 0000000..5cd2f4a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java @@ -0,0 +1,32 @@ +package org.dromara.payment.channel.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BaseCompInfo + * @description + * @create 2024-04-23 14:50 + */ +@Data +public class BaseCompInfo implements Serializable { + + @ExcelProperty("企业名称") + private String name; + + @ExcelProperty("统一社会信用代码") + private String xyCode; + + + @ExcelProperty("区域") + private String area; + + + @ExcelProperty("实际经营地址") + private String address; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java new file mode 100644 index 0000000..c38c376 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.channel.domain.vo; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户同步记录视图对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelAccountSyn.class) +public class BusChannelAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java new file mode 100644 index 0000000..074428b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java @@ -0,0 +1,157 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户视图对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelAccount.class) +public class BusChannelAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型 + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 总收益(分) + */ + @ExcelProperty(value = "总收益(分)") + private Long balance; + + /** + * 冻结金额(分) + */ + @ExcelProperty(value = "冻结金额(分)") + private Long frozen; + + /** + * 已提现金额(分) + */ + @ExcelProperty(value = "已提现金额(分)") + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isDefault; + + /** + * 昨日收益(分) + */ + @ExcelProperty(value = "昨日收益(分)") + private Long yesterday; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + //开户支行 + private String khd; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java new file mode 100644 index 0000000..38e1b1c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java @@ -0,0 +1,194 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商提现记录视图对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelCashout.class) +public class BusChannelCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 代理商账户id + */ + @ExcelProperty(value = "代理商账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 支付凭证图片 + */ + @ExcelProperty(value = "支付凭证图片") + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java new file mode 100644 index 0000000..2d4f35e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java @@ -0,0 +1,182 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商流水视图对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelFlows.class) +public class BusChannelFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号(系统内部编号)") + private String busNo; + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账,2=:代发,3=:提现,4=:退回,5=:冻结,6=:解冻,7=:充值") + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java new file mode 100644 index 0000000..fca084d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java @@ -0,0 +1,159 @@ +package org.dromara.payment.channel.domain.vo; + +import java.math.BigDecimal; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.channel.domain.BusChannelProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商产品视图对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelProduct.class) +public class BusChannelProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商服务费率(%) + */ + @ExcelProperty(value = "运营商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + @ExcelProperty(value = "代理商服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + + private String serviceName; + + private Long unId; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java new file mode 100644 index 0000000..ecf3f33 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商业务员视图对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelSalesman.class) +public class BusChannelSalesmanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelIgnore + private Long id; + + /** + * 代理商id + */ + @ExcelIgnore + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 业务员名称 + */ + @ExcelProperty(value = "业务员名称") + private String name; + + /** + * 业务员编号 + */ + @ExcelProperty(value = "业务员编号") + private String no; + + /** + * 添加时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 添加人 + */ + @ExcelIgnore + private String createBy; + + + @ExcelProperty(value = "备注") + private String remarker; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java new file mode 100644 index 0000000..70b2cd2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java @@ -0,0 +1,251 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannel; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商视图对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannel.class) +public class BusChannelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + @ExcelProperty(value = "代理商类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:企业,:2:个人") + private Integer dwType; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String name; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户账号 + */ + @ExcelProperty(value = "开户账号") + private String bankCard; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 银行卡正面 + */ + @ExcelProperty(value = "银行卡正面") + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 父级代理商 + */ + @ExcelProperty(value = "父级代理商") + private Long pId; + + /** + * 代理上下级关系编码 + */ + @ExcelProperty(value = "代理上下级关系编码") + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + private String yyzz; + + private String khxkz ; + + private Integer dwLevel; + + private String verifyStatusName; + + private Date createTime; + + private Long createUnitId; + + private String createUnitNo; + + + public String getVerifyStatusName() { + if(this.verifyStatus == null){ + return "--"; + } + if(this.verifyStatus.equals(0L)){ + return "待审核"; + }else if(this.verifyStatus.equals(1L)){ + return "驳回"; + }else{ + return "审核通过"; + } + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java new file mode 100644 index 0000000..f96b72e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java @@ -0,0 +1,60 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; + +import java.util.List; + +/** + * 代理商账户Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelAccountMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户已提现金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashout(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户昨日收益 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateYesterday(@Param("channelId") int channelId, @Param("amount") long amount); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java new file mode 100644 index 0000000..8bc9394 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.channel.mapper; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 代理商账户同步记录Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelAccountSynMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java new file mode 100644 index 0000000..48bbf5a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; + +import java.util.List; + +/** + * 代理商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelCashoutMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java new file mode 100644 index 0000000..695af59 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java @@ -0,0 +1,16 @@ +package org.dromara.payment.channel.mapper; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.operator.domain.BusOperatorFlows; + +/** + * 代理商流水Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelFlowsMapper extends BaseMapperPlus { + public int insertSelective(BusChannelFlows flow); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java new file mode 100644 index 0000000..61dc5dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 代理商Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelMapper extends BaseMapperPlus { + + + + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + Page selBusChannelLists(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java new file mode 100644 index 0000000..cbd7949 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java @@ -0,0 +1,77 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 代理商产品Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelProductMapper extends BaseMapperPlus { + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:根据代理商信息查询代理商的产品信息 + **/ + + List selectAgentProInfos(Map map); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:根据运营商信息查询运营商的产品信息 + **/ + List selectOperProInfos(Map map); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:运营商分配-根据代理商信息查询代理商的产品信息 + **/ + Page selectOperAgentProList(@Param("bo")BusChannelProductBo bo, @Param("page") IPage page); + + + /*** + * 代理商分配-代理商分配产品 + * @param bo + * @param page + * @return + */ + Page selectAgentProList(@Param("bo")BusChannelProductBo bo, @Param("page") IPage page); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 18:34 + * 说明:根据产品信息查询产品最小费率 + **/ + + BigDecimal selMinChargeFromChannelProByAgentInfo(Map map); + + + + int updateBusChannelCost(BusChannelProductBo busChannelProductBo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java new file mode 100644 index 0000000..9b82fb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 代理商业务员Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelSalesmanMapper extends BaseMapperPlus { + + + @DataPermission({ + @DataColumn(key="colomField",value="channel_no") + }) + public List selectDataTest(); + + + + @DataPermission({ + @DataColumn(key="colomField",value="t.channel_no") + }) + public Page selectSaleMans(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + @DataPermission({ + @DataColumn(key="colomField",value="channel_no") + }) + public List selectSaleMansList(); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java new file mode 100644 index 0000000..9693e5b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java @@ -0,0 +1,75 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商账户Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelAccountService { + + /** + * 查询代理商账户 + */ + BusChannelAccountVo queryById(Long id); + + /** + * 查询代理商账户列表 + */ + TableDataInfo queryPageList(BusChannelAccountBo bo, PageQuery pageQuery); + + /** + * 查询代理商账户列表 + */ + List queryList(BusChannelAccountBo bo); + + /** + * 新增代理商账户 + */ + Boolean insertByBo(BusChannelAccountBo bo); + + /** + * 修改代理商账户 + */ + Boolean updateByBo(BusChannelAccountBo bo); + + /** + * 校验并批量删除代理商账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(long unitId,long amount); + + /** + * 递增或递减账户冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(long unitId,long amount); + + /** + * 查询代理商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusChannelAccountVo getCashoutAccount(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java new file mode 100644 index 0000000..c8547e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商账户同步记录Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelAccountSynService { + + /** + * 查询代理商账户同步记录 + */ + BusChannelAccountSynVo queryById(Long id); + + /** + * 查询代理商账户同步记录列表 + */ + TableDataInfo queryPageList(BusChannelAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询代理商账户同步记录列表 + */ + List queryList(BusChannelAccountSynBo bo); + + /** + * 新增代理商账户同步记录 + */ + Boolean insertByBo(BusChannelAccountSynBo bo); + + /** + * 修改代理商账户同步记录 + */ + Boolean updateByBo(BusChannelAccountSynBo bo); + + /** + * 校验并批量删除代理商账户同步记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java new file mode 100644 index 0000000..1382f13 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java @@ -0,0 +1,67 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商提现记录Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelCashoutService { + + /** + * 查询代理商提现记录 + */ + BusChannelCashoutVo queryById(Long id); + + /** + * 查询代理商提现记录列表 + */ + TableDataInfo queryPageList(BusChannelCashoutBo bo, PageQuery pageQuery); + + /** + * 查询代理商提现记录列表 + */ + List queryList(BusChannelCashoutBo bo); + + /** + * 新增代理商提现记录 + */ + Boolean insertByBo(BusChannelCashoutBo bo); + + /** + * 修改代理商提现记录 + */ + Boolean updateByBo(BusChannelCashoutBo bo); + + /** + * 校验并批量删除代理商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 代理商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); + + /** + * 审批代理商提现记录 + * @param bo + * @return + */ + Boolean verifyCashout(BusChannelCashoutBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java new file mode 100644 index 0000000..eb28e73 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商流水Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelFlowsService { + + /** + * 查询代理商流水 + */ + BusChannelFlowsVo queryById(Long id); + + /** + * 查询代理商流水列表 + */ + TableDataInfo queryPageList(BusChannelFlowsBo bo, PageQuery pageQuery); + + /** + * 查询代理商流水列表 + */ + List queryList(BusChannelFlowsBo bo); + + /** + * 新增代理商流水 + */ + Boolean insertByBo(BusChannelFlowsBo bo); + + /** + * 修改代理商流水 + */ + Boolean updateByBo(BusChannelFlowsBo bo); + + /** + * 校验并批量删除代理商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java new file mode 100644 index 0000000..2a3bc11 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java @@ -0,0 +1,50 @@ +package org.dromara.payment.channel.service; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商产品Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelProductService { + + /** + * 查询代理商产品 + */ + BusChannelProductVo queryById(Long id); + + /** + * 查询代理商产品列表 + */ + TableDataInfo queryPageList(BusChannelProductBo bo, PageQuery pageQuery); + + /** + * 查询代理商产品列表 + */ + List queryList(BusChannelProductBo bo); + + /** + * 新增代理商产品 + */ + Boolean insertByBo(JSONObject bo); + + /** + * 修改代理商产品 + */ + Boolean updateByBo(BusChannelProductBo bo); + + /** + * 校验并批量删除代理商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java new file mode 100644 index 0000000..5643667 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java @@ -0,0 +1,52 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商业务员Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelSalesmanService { + + + + TableDataInfo selectSaleMans(BusChannelSalesmanBo bo, PageQuery pageQuery); + /** + * 查询代理商业务员 + */ + BusChannelSalesmanVo queryById(Long id); + + /** + * 查询代理商业务员列表 + */ + TableDataInfo queryPageList(BusChannelSalesmanBo bo, PageQuery pageQuery); + + /** + * 查询代理商业务员列表 + */ + List queryList(BusChannelSalesmanBo bo); + + /** + * 新增代理商业务员 + */ + Boolean insertByBo(BusChannelSalesmanBo bo); + + /** + * 修改代理商业务员 + */ + Boolean updateByBo(BusChannelSalesmanBo bo); + + /** + * 校验并批量删除代理商业务员信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java new file mode 100644 index 0000000..ae741cc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java @@ -0,0 +1,81 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelService { + + /** + * 查询代理商 + */ + BusChannelVo queryById(Long id); + + /** + * 查询代理商列表 + */ + TableDataInfo queryPageList(BusChannelBo bo, PageQuery pageQuery); + + + /*** + * 代理商产品配置-查询代理商列表 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo queryPageListProConfig(BusChannelBo bo, PageQuery pageQuery); + + /** + * 查询代理商列表 + */ + List queryList(BusChannelBo bo); + + /** + * 新增代理商 + */ + Boolean insertByBo(BusChannelBo bo); + + /** + * 修改代理商 + */ + Boolean updateByBo(BusChannelBo bo); + + /** + * 校验并批量删除代理商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 根据登录用户获取代理商详情 + */ + BaseCompInfo getAgentInfo(); + + + /*** + * 审核代理商 + * @param chId 代理商id + * @param checkType 审核类型 + * @param reason 原因 + * @return + */ + boolean checkChannel(Long chId,Long checkType,String reason,String domain); + + + + List getDwLevel(); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java new file mode 100644 index 0000000..2f4f765 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java @@ -0,0 +1,184 @@ +package org.dromara.payment.channel.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelAccountServiceImpl implements IBusChannelAccountService { + + private final BusChannelAccountMapper baseMapper; + + private final BusChannelMapper channelMapper; + + private final BusAccountsMapper accountsMapper; + + /** + * 查询代理商账户 + */ + @Override + public BusChannelAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商账户列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelAccountBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商账户列表 + */ + @Override + public List queryList(BusChannelAccountBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusChannelAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper(new BusChannelAccount()); + lqw.eq(bo.getChannelId() != null,"t.channel_id",bo.getChannelId()); + lqw.eq(bo.getStatus() != null,"t.status",bo.getStatus()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("channel_name"))){ + lqw.like("t1.name",bo.getParams().get("channel_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.eq("t1.no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(params.get("level_channel_no"))){ + lqw.likeRight("t1.no",params.get("level_channel_no")); + } + if(StringUtils.isNotBlank(params.get("dw_level"))){ + lqw.eq("t1.dw_level",params.get("dw_level")); + } + String yesterday = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD,DateUtils.getEndDateByDays(new Date(),-1)); + lqw.getEntity().setFlowsBeginTime(yesterday+" 00:00:00"); + lqw.getEntity().setFlowsEndTime(yesterday+" 23:59:59"); + return lqw; + } + + /** + * 新增代理商账户 + */ + @Override + @Transactional + public Boolean insertByBo(BusChannelAccountBo bo) { + BusChannelAccount add = MapstructUtils.convert(bo, BusChannelAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + BusAccounts bab = new BusAccounts(); + bab.setAccId(0L); + bab.setIsDefault(1L); + bab.setUnitId(bo.getChannelId()); + bab.setAddYpe(7); + bab.setSydId(0L); + this.accountsMapper.insert(bab); + return flag; + } + + /** + * 修改代理商账户 + */ + @Override + public Boolean updateByBo(BusChannelAccountBo bo) { + BusChannelAccount update = MapstructUtils.convert(bo, BusChannelAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(long unitId, long amount) { + Integer baseNum = accountsMapper.updateBalance(0L,unitId,amount,null); + Integer curNum = baseMapper.updateBalance(unitId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(long unitId, long amount) { + Integer baseNum = accountsMapper.updateFrozen(0L,unitId,amount,null); + Integer curNum = baseMapper.updateFrozen(unitId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusChannelAccountVo getCashoutAccount(Long id) { + BusChannelAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusChannelVo vo = channelMapper.selectVoById(rtn.getChannelId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + rtn.setChannelNo(vo.getNo()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java new file mode 100644 index 0000000..8fdfaad --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.channel.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.mapper.BusChannelAccountSynMapper; +import org.dromara.payment.channel.service.IBusChannelAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商账户同步记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelAccountSynServiceImpl implements IBusChannelAccountSynService { + + private final BusChannelAccountSynMapper baseMapper; + + /** + * 查询代理商账户同步记录 + */ + @Override + public BusChannelAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商账户同步记录列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商账户同步记录列表 + */ + @Override + public List queryList(BusChannelAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, BusChannelAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, BusChannelAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), BusChannelAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, BusChannelAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增代理商账户同步记录 + */ + @Override + public Boolean insertByBo(BusChannelAccountSynBo bo) { + BusChannelAccountSyn add = MapstructUtils.convert(bo, BusChannelAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改代理商账户同步记录 + */ + @Override + public Boolean updateByBo(BusChannelAccountSynBo bo) { + BusChannelAccountSyn update = MapstructUtils.convert(bo, BusChannelAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商账户同步记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java new file mode 100644 index 0000000..5c4fe43 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java @@ -0,0 +1,391 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.mapper.BusChannelCashoutMapper; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 代理商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelCashoutServiceImpl implements IBusChannelCashoutService { + + private final BusChannelCashoutMapper baseMapper; + + private final IBusChannelAccountService channelAccountService; + + private final BusChannelAccountMapper channelAccountMapper; + + private final BusChannelMapper channelMapper; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final BusOperatorMapper operatorMapper; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final BusOperatorAccountMapper operatorAccountMapper; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询代理商提现记录 + */ + @Override + public BusChannelCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelCashoutBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商提现记录列表 + */ + @Override + public List queryList(BusChannelCashoutBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusChannelCashoutBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), "t.bus_no", bo.getBusNo()); + lqw.eq(bo.getAmount() != null, "t.amount", bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), "t.khh", bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), "t.khh_no", bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), "t.fr", bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), "t.khd", bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, "t.verify_time", bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "t.verify_by", bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), "t.verify_reason", bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoicePic()), "t.invoice_pic", bo.getInvoicePic()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), "t.pay_remark", bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), "t.pay_receipt", bo.getPayReceipt()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("channel_name"))){ + lqw.like("t1.name",bo.getParams().get("channel_name")); + } + + lqw.orderByDesc("t.add_time"); + + return lqw; + } + + /** + * 新增代理商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusChannelCashoutBo bo) { + BusChannelCashout add = MapstructUtils.convert(bo, BusChannelCashout.class); + validEntityBeforeSave(add); + BusChannelAccountVo vo = channelAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } +// BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,vo.getChannelId())); +// billService.checkPayPassword(BusRole.AGENT, vo.getChannelId(), () -> { +// if(StringUtils.isBlank(channel.getPayPassword())){ +// throw new ServiceException("请前往系统管理进行支付密码重置!"); +// } +// return bo.getPassword().equals(channel.getPayPassword()); +// }); + String busDesc = "代理商提现"; + if(channelAccountService.updateFrozen(vo.getChannelId(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setChannelId(vo.getChannelId()); + add.setChannelNo(vo.getChannelNo()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+ IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean verifyCashout(BusChannelCashoutBo bo) { + BusChannelCashoutVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("提现申请不存在,审核失败"); + } + if(vo.getVerifyStatus() != 0){ + throw new ServiceException("提现申请已审核"); + } + BusChannelCashout update = MapstructUtils.convert(bo, BusChannelCashout.class); + update.setVerifyTime(new Date()); + String busDesc = "代理商提现"; + if(update.getVerifyStatus() == 1){//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusChannelCashout::getId,bo.getId()) + .eq(BusChannelCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + if(channelAccountService.updateFrozen(vo.getChannelId(),-bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户可用余额不足"); + } + }else if(update.getVerifyStatus() == 2){//审批通过 +// update.setPayStatus(2l);//支付中 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusChannelCashout::getId,bo.getId()) + .eq(BusChannelCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + + this.cashoutResultOffline(bo); + +// BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,vo.getChannelId())); +// Account bankAcc = new Account(); +// bankAcc.setBankType(vo.getPassage()); +// bankAcc.setBankCard(vo.getBankCard()); +// bankAcc.setUnitId(0l); +// bankAcc.setName(vo.getFr()); +// if(channel.getDwType() == 1) { +// bankAcc.setType((short) 3);//3:真实企业账户 +// }else if(channel.getDwType() == 2){ +// bankAcc.setType((short) 2);//2:真实个人账户 +// } +// Result addRtn = accountService.addAccount(bankAcc); +// String msg = "创建交易账号失败"; +// +// if (addRtn.hasError()) { +// throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); +// }else if (addRtn.hasTip()) { +// throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); +// }else if (addRtn.getRtnData() == null) { +// throw new ServiceException(msg); +// } + //代理商提现 +// TranLog backLog = new TranLog(); +// backLog.setBusType(3l); +// backLog.setBusItem(5l); +// backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); +// backLog.setBuisId(vo.getId()); +// BusOperator operator = operatorMapper.selectOne(new LambdaQueryWrapper().eq(BusOperator::getNo,channel.getOperatorNo())); +// if(operator == null){ +// throw new ServiceException("运营商不存在,提现失败"); +// } +// BusOperatorAccountVo opAcc = operatorAccountMapper.selectVoOne(new LambdaQueryWrapper() +// .eq(BusOperatorAccount::getSydId,vo.getSydId()) +// .eq(BusOperatorAccount::getOpId,operator.getId()) +// .eq(BusOperatorAccount::getBankType,vo.getPassage()) +// .eq(BusOperatorAccount::getIsDefault,1)); +// if(opAcc == null){ +// throw new ServiceException("运营商未开通资金账户,提现失败"); +// } +// Result backRtn = accountService.applyTransfer(opAcc.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), vo.getBusNo(), "提现"); +// if (backRtn.hasError()) { +// throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); +// }else if (backRtn.hasTip()) { +// throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); +// }else if (backRtn.getRtnData() == null) { +// throw new ServiceException(busDesc + ",发送交易申请失败"); +// } +// backLog.setTranId(backRtn.getRtnData().getId()); +// backLog.setAddTime(new Date()); +// backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); +// backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); +// backLog.setSourceAccType(BusRole.OPERATOR.getId()); +// backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); +// backLog.setTargetAccType(BusRole.AGENT.getId()); +// backLog.setIsCallback(0); +// tranLogDao.insert(backLog); + } + return true; + } + + + + @Transactional(rollbackFor = Exception.class) + public void cashoutResultOffline(BusChannelCashoutBo bo) { + String busDesc = "代理商提现"; + BusChannelCashoutVo vo = baseMapper.selectVoById(bo.getId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+bo.getId()+")"); + } + + if(channelAccountService.updateFrozen(vo.getChannelId(),-vo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+bo.getId()+")"); + } + if(channelAccountService.updateBalance(vo.getChannelId(),-vo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+bo.getId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,0) + .set(BusChannelCashout::getPayStatus,3) + .set(BusChannelCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+bo.getId()+")"); + } + channelAccountMapper.updateCashout(vo.getChannelId(),vo.getAmount()); + BusChannelVo channel = channelMapper.selectVoById(vo.getChannelId()); + BusOperatorVo operVo = operatorMapper.selectVoById(LoginHelper.getBusId()); + channelFlowsMapper.insertSelective(new BusChannelFlows(2,channel.getId(),15,vo.getBusNo(),-vo.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,3,BusRole.OPERATOR.getId(),operVo.getId(),operVo.getKhm(),operVo.getBankCard(),0l,BusRole.AGENT.getId(), channel.getId(),channel.getKhm(),vo.getBankCard(),null,"")); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "代理商提现"; + BusChannelCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(channelAccountService.updateFrozen(vo.getChannelId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(channelAccountService.updateBalance(vo.getChannelId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,2) + .set(BusChannelCashout::getPayStatus,3) + .set(BusChannelCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + channelAccountMapper.updateCashout(vo.getChannelId(),tran.getAmount()); + BusChannelVo channel = channelMapper.selectVoById(vo.getChannelId()); + channelFlowsMapper.insertSelective(new BusChannelFlows(2,channel.getId(),15,vo.getBusNo(),-tran.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,3,BusRole.AGENT.getId(),vo.getChannelId(),channel.getKhm(),tran.getTargetAccName(),0l,BusRole.AGENT.getId(), channel.getId(),channel.getKhm(),tran.getTargetCard(),tran.getTargetAccId().longValue(),"")); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,2) + .set(BusChannelCashout::getPayStatus,4) + .set(BusChannelCashout::getPayTime,new Date()) + .set(BusChannelCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } + + /** + * 修改代理商提现记录 + */ + @Override + public Boolean updateByBo(BusChannelCashoutBo bo) { + BusChannelCashout update = MapstructUtils.convert(bo, BusChannelCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java new file mode 100644 index 0000000..08d0e19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java @@ -0,0 +1,132 @@ +package org.dromara.payment.channel.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.service.IBusChannelFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商流水Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelFlowsServiceImpl implements IBusChannelFlowsService { + + private final BusChannelFlowsMapper baseMapper; + + /** + * 查询代理商流水 + */ + @Override + public BusChannelFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商流水列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelFlowsBo bo, PageQuery pageQuery) { + bo.setChannelId(LoginHelper.getBusId()); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商流水列表 + */ + @Override + public List queryList(BusChannelFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getChannelId() != null, BusChannelFlows::getChannelId, bo.getChannelId()); + lqw.eq(bo.getBusType() != null, BusChannelFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusChannelFlows::getBusNo, bo.getBusNo()); + lqw.eq(bo.getMoney() != null, BusChannelFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusChannelFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusChannelFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusChannelFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusChannelFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusChannelFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusChannelFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusChannelFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(bo.getTranType() != null, BusChannelFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getPayerType() != null, BusChannelFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusChannelFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusChannelFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusChannelFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusChannelFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusChannelFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusChannelFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusChannelFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusChannelFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusChannelFlows::getPayeeAccId, bo.getPayeeAccId()); + return lqw; + } + + /** + * 新增代理商流水 + */ + @Override + public Boolean insertByBo(BusChannelFlowsBo bo) { + BusChannelFlows add = MapstructUtils.convert(bo, BusChannelFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改代理商流水 + */ + @Override + public Boolean updateByBo(BusChannelFlowsBo bo) { + BusChannelFlows update = MapstructUtils.convert(bo, BusChannelFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java new file mode 100644 index 0000000..5020319 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java @@ -0,0 +1,275 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.channel.service.IBusChannelProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 代理商产品Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelProductServiceImpl extends BaseService implements IBusChannelProductService { + + private final BusChannelProductMapper baseMapper; + + private final BusMerchantProductMapper busMerchantProductMapper; + + /** + * 查询代理商产品 + */ + @Override + public BusChannelProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 给代理商分配产品,查询列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelProductBo bo, PageQuery pageQuery) { + if(bo.getChId() == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + if(bo.getBusType() == null){ + this.invalidationParamsException("业务类型不能为空"); + } + bo.setChannelId(LoginHelper.getBusId()); + int burRole = LoginHelper.getLoginUser().getBusRole(); + Page result = null; + if(burRole == BusRole.AGENT.getId()){ + result = baseMapper.selectAgentProList(bo,pageQuery.build()); + }else if(burRole == BusRole.OPERATOR.getId()){ + result = baseMapper.selectOperAgentProList(bo,pageQuery.build()); + } + result.getRecords().forEach(item -> { + item.setUnId(IdUtil.getSnowflakeNextId()); + }); + return TableDataInfo.build(result); + } + + /** + * 查询代理商产品列表 + */ + @Override + public List queryList(BusChannelProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusChannelProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusChannelProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusChannelProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusChannelProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusChannelProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusChannelProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusChannelProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusChannelProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusChannelProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChannelId() != null, BusChannelProduct::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusChannelProduct::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getChargeMode() != null, BusChannelProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusChannelProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusChannelProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusChannelProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusChannelProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusChannelProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增代理商产品 + */ + @Override + @Transactional + public Boolean insertByBo(JSONObject bo) { + Long chId = bo.getLong("chId"); + String chNo = bo.getString("chNo"); + Integer busType = bo.getInteger("busType"); + String proListStr = bo.getString("boList"); + + if(chId == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + + if(chNo == null){ + this.invalidationParamsException("代理商编码不能为空"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(StringUtils.isEmpty(proListStr)){ + this.invalidationParamsException("产品列表不能为空"); + } + + Map paraMap = new HashMap(); + paraMap.put("channel_no", LoginHelper.getNo()); + paraMap.put("bus_type",busType); + List agentList = new ArrayList(); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + agentList = this.baseMapper.selectAgentProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前代理商未配置产品"); + } + }else if(busRole == BusRole.OPERATOR.getId()){ + agentList = this.baseMapper.selectOperProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前运营商未配置产品"); + } + } + + List voList = JSONUtil.toList(bo.getJSONArray("boList").toJSONString(), BusChannelProductBo.class); + + List insertList = new ArrayList(); + List updateList = new ArrayList(); + for(BusChannelProductBo vo1 :voList){ + + BusChannelProductVo agentVo = agentList.stream().filter(t -> t.getProNo().equals(vo1.getProNo())).findFirst().orElse(null); + if(agentVo == null){ + this.invalidationParamsException("产品["+vo1.getProNo()+"]未配置"); + } + + + vo1.setSydId(agentVo.getSydId()); + vo1.setSydNo(agentVo.getSydNo()); + vo1.setProId(agentVo.getProId()); + vo1.setOpId(agentVo.getOpId()); + vo1.setOpNo(agentVo.getOpNo()); + vo1.setBusType(agentVo.getBusType()); + vo1.setChannelId(chId); + vo1.setChannelNo(chNo); + vo1.setCostServiceCharge(agentVo.getServiceCharge()); + vo1.setMaxMonth(agentVo.getMaxMonth()); + vo1.setCreateBy(LoginHelper.getUserId()); + vo1.setCreateTime(new Date()); + if(vo1.getServiceCharge() != null){ + if(vo1.getServiceCharge().compareTo(vo1.getCostServiceCharge()) < 0){ + vo1.setServiceCharge(vo1.getCostServiceCharge()); + } + Map pMap = new HashMap(); + pMap.put("channelNo",chNo); + pMap.put("busType",busType); + pMap.put("proNo",vo1.getProNo()); + BigDecimal merMinCharge = this.busMerchantProductMapper.selMinChargeByAgentAndBusType(pMap); + + pMap.put("channelNo",chNo+"-"); + pMap.put("channelId",chId); + BigDecimal chMinCharge = this.baseMapper.selMinChargeFromChannelProByAgentInfo(pMap); + BigDecimal min = merMinCharge; + + if(min != null && chMinCharge != null && chMinCharge.compareTo(min) < 0){ + min = chMinCharge; + }else if(min == null && chMinCharge != null){ + min = chMinCharge; + } + if(min != null && vo1.getServiceCharge().compareTo(min) > 0){ + this.invalidationParamsException("产品["+vo1.getProNo()+"]分配费率不能超过"+min.toString()+"请重新分配"); + } + } + ValidatorUtils.validate(vo1, AddGroup.class); + BusChannelProduct bp = MapstructUtils.convert(vo1, BusChannelProduct.class); + if(busRole == BusRole.OPERATOR.getId()){ + bp.setUpIsOp(1); + }else{ + bp.setUpIsOp(0); + } + bp.setCreateTime(new Date()); + bp.setCreateBy(LoginHelper.getUserId()); + if(vo1.getId() != null ){ + insertList.add(bp); + if(bp.getProStatus() == 1){ + updateList.add(bp); + } + }else{ + insertList.add(bp); + } + } + this.baseMapper.insertOrUpdateBatch(insertList); + + for(BusChannelProduct pro : updateList){ + BusMerchantProductBo proBo = new BusMerchantProductBo(); + proBo.setProNo(pro.getProNo()); + proBo.setCostServiceCharge(pro.getServiceCharge()); + proBo.setBusType(pro.getBusType()); + proBo.setChannelNo(chNo); + proBo.setUpdateBy(LoginHelper.getUserId()); + proBo.setUpdateTime(new Date()); + this.busMerchantProductMapper.updateMerProInfos(proBo); + + + BusChannelProductBo bpBo = new BusChannelProductBo(); + bpBo.setCostServiceCharge(pro.getServiceCharge()); + bpBo.setProNo(pro.getProNo()); + bpBo.setBusType(pro.getBusType()); + bpBo.setChannelId(chId); + bpBo.setChannelNo(chNo); + + this.baseMapper.updateBusChannelCost(bpBo); + + } + return true; + } + + /** + * 修改代理商产品 + */ + @Override + public Boolean updateByBo(BusChannelProductBo bo) { + BusChannelProduct update = MapstructUtils.convert(bo, BusChannelProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java new file mode 100644 index 0000000..c18f233 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.checkerframework.checker.units.qual.C; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.mapper.BusChannelSalesmanMapper; +import org.dromara.payment.channel.service.IBusChannelSalesmanService; + +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商业务员Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelSalesmanServiceImpl extends BaseService implements IBusChannelSalesmanService { + + private final BusChannelSalesmanMapper baseMapper; + + @Override + public TableDataInfo selectSaleMans(BusChannelSalesmanBo bo, PageQuery pageQuery) { + + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null ,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getChannelName()),"t2.name",bo.getChannelName()); + lqw.orderByDesc("t.create_time"); + Page page = pageQuery.build(); + Page result = this.baseMapper.selectSaleMans(page, lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商业务员 + */ + @Override + public BusChannelSalesmanVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商业务员列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelSalesmanBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商业务员列表 + */ + @Override + public List queryList(BusChannelSalesmanBo bo) { + return baseMapper.selectSaleMansList(); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelSalesmanBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getChannelId() != null, BusChannelSalesman::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusChannelSalesman::getChannelNo, bo.getChannelNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusChannelSalesman::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusChannelSalesman::getNo, bo.getNo()); + lqw.eq(bo.getCreateTime() != null, BusChannelSalesman::getCreateTime, bo.getCreateTime()); + lqw.eq(StringUtils.isNotBlank(bo.getCreateBy()), BusChannelSalesman::getCreateBy, bo.getCreateBy()); + lqw.orderByDesc(true, BusChannelSalesman::getCreateTime); + return lqw; + } + + public static void main(String[] args) { + for(int i = 0 ; i < 100 ;i++){ + System.out.println(getSalemano()); + } + } + + /** + * 新增代理商业务员 + */ + @Override + public Boolean insertByBo(BusChannelSalesmanBo bo) { + BusChannelSalesman add = MapstructUtils.convert(bo, BusChannelSalesman.class); + validEntityBeforeSave(add); + add.setChannelId(LoginHelper.getBusId()); + add.setChannelNo(LoginHelper.getNo()); + add.setCreateBy(LoginHelper.getUserId()); + add.setCreateTime(new Date()); + + if(StringUtils.isEmpty(add.getNo())){ + String no = getSalemano(); + add.setNo(no); + } + add.setChannelId(LoginHelper.getBusId()); + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch (Exception e){ + e.printStackTrace(); + if(e instanceof DuplicateKeyException){ + String no = getSalemano(); + bo.setNo(no); + return this.insertByBo(bo); + }else{ + throw e; + } + } + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + public static String getSalemano() { + return RandomUtil.randomString("0123456789",6); + } + + /** + * 修改代理商业务员 + */ + @Override + public Boolean updateByBo(BusChannelSalesmanBo bo) { + if(bo.getId() == null){ + this.invalidationParamsException("业务员ID不能为空"); + } + if(StringUtils.isEmpty(bo.getName())){ + this.invalidationParamsException("业务员名称不能为空"); + } + BusChannelSalesman update = MapstructUtils.convert(bo, BusChannelSalesman.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelSalesman entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商业务员 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java new file mode 100644 index 0000000..b9da659 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java @@ -0,0 +1,511 @@ +package org.dromara.payment.channel.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.service.IBusChannelService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 代理商Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelServiceImpl extends BaseService implements IBusChannelService { + + private final BusChannelMapper baseMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final BusOperatorMapper busOperatorMapper; + + private final SysSydMapper sysSydMapper; + + private final IBusChannelAccountService busChannelAccountService; + @Resource + private ISysUnitService sysUnitService; + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + @DubboReference + private RemoteDictService remoteDictService; + + /** + * 查询代理商 + */ + @Override + public BusChannelVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + + public List getDwLevel(){ + List dictList = this.remoteDictService.selectDictDataByType("agent_level"); + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.PLATFORM.getId()){ + return dictList; + }else if(busRole == BusRole.OPERATOR.getId()){ + return dictList; + }else if(busRole == BusRole.AGENT.getId()){ + Long channelId = LoginHelper.getBusId(); + BusChannelVo bco = this.baseMapper.selectVoById(channelId); + List resultList = new ArrayList<>(); + dictList.forEach(item->{ + if(Integer.valueOf(item.getDictValue()) > bco.getDwLevel()){ + resultList.add(item); + } + }); + return resultList; + }else{ + return new ArrayList<>(); + } + + } + + + /** + * 查询代理商列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getDwType() != null,"t.dw_type",bo.getDwType()); + lqw.eq(bo.getDwLevel() != null,"t.dw_level",bo.getDwLevel()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.eq(bo.getVerifyStatus() != null,"t.verify_status",bo.getVerifyStatus()); + lqw.ne(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.no",LoginHelper.getNo() ); + if(bo.getIsProduct() != null && bo.getIsProduct() == 1){ + lqw.eq("t.create_unit_id",LoginHelper.getBusId()); + } + + + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selBusChannelLists(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + + /** + * 产品配置-查询代理商列表 + */ + @Override + public TableDataInfo queryPageListProConfig(BusChannelBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getDwType() != null,"t.dw_type",bo.getDwType()); + lqw.eq(bo.getDwLevel() != null,"t.dw_level",bo.getDwLevel()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.ne(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.no",LoginHelper.getNo() ); + int role = LoginHelper.getLoginUser().getBusRole(); + if(role == BusRole.AGENT.getId()){ + lqw.eq("t.p_id",LoginHelper.getBusId()); + }else if(role == BusRole.OPERATOR.getId()){ + lqw.isNull("t.p_id"); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selBusChannelLists(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商列表 + */ + @Override + public List queryList(BusChannelBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusChannel::getNo, bo.getNo()); + lqw.eq(bo.getDwType() != null, BusChannel::getDwType, bo.getDwType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusChannel::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusChannel::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusChannel::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusChannel::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusChannel::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusChannel::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusChannel::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusChannel::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusChannel::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusChannel::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusChannel::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusChannel::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusChannel::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusChannel::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusChannel::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusChannel::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusChannel::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), BusChannel::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusChannel::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusChannel::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankZm()), BusChannel::getBankZm, bo.getBankZm()); + lqw.eq(bo.getStatus() != null, BusChannel::getStatus, bo.getStatus()); + lqw.eq(bo.getPId() != null, BusChannel::getPId, bo.getPId()); + lqw.eq(StringUtils.isNotBlank(bo.getLevelCode()), BusChannel::getLevelCode, bo.getLevelCode()); + lqw.eq(bo.getVerifyStatus() != null, BusChannel::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, BusChannel::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), BusChannel::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), BusChannel::getVerifyReason, bo.getVerifyReason()); + lqw.between(bo.getStartTime() != null, BusChannel::getCreateTime, bo.getStartTime(), bo.getEndTime()); + return lqw; + } + + public static void main(String[] args) { + BusChannelBo bo = new BusChannelBo(); + + bo.setName("代理商名称"); + bo.setDwType(1); + bo.setDwLevel(1); + bo.setNsrSbh("统一社会信用代码"); + bo.setFr("法人"); + bo.setFrSfz("法人身份证"); + bo.setFrSjh("法人手机号"); + bo.setWtr("经办人姓名"); + bo.setWtrSjh("经办人手机号"); + bo.setWtrEmail("经办人邮件"); + bo.setAddress("实际经营地址"); + bo.setUnitArea("区域code"); + bo.setUnitAreaName("区域名"); + bo.setKhm("开户名"); + bo.setKhh("开户行"); + bo.setKhd("开户支行"); + bo.setKhhNo("开户行行号/银联号"); + bo.setBankCard("开户账号"); + bo.setYyzz("营业执照"); + bo.setKhxkz("开户许可证"); + bo.setFrSfzzm("法人身份证正面"); + bo.setFrSfzfm("法人身份证反面"); + bo.setBankZm("银行卡正面"); + + System.out.println(JSONUtil.toJsonStr(bo)); + + } + + /** + * 新增代理商 + */ + @Override + @Transactional + public Boolean insertByBo(BusChannelBo bo) { + + + if(bo.getDwType().intValue() == 1){ + + if(StringUtils.isEmpty(bo.getYyzz())){ + this.invalidationParamsException("营业执照不能为空"); + } + + if(StringUtils.isEmpty(bo.getKhxkz())){ + this.invalidationParamsException("开户许可证不能为空"); + } + + }else{ + if(StringUtils.isEmpty(bo.getBankZm())){ + this.invalidationParamsException("银行卡正面不能为空"); + } + } + + + if(StringUtils.isEmpty(bo.getNo())){ + bo.setNo(LoginHelper.getNo()+"-"+this.getAgentNo(bo)); + } + + + long id = IdUtil.getSnowflakeNextId(); + + BusChannel add = MapstructUtils.convert(bo, BusChannel.class); + add.setId(id); + add.setCreateTime(new Date()); + add.setCreateBy(LoginHelper.getUserId()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + add.setPId(LoginHelper.getBusId()); + } + if(StringUtils.isNotEmpty(LoginHelper.getNo())){ + String[] pCodes = LoginHelper.getNo().split("-"); + add.setOperatorNo(pCodes[0]); + } + add.setVerifyStatus(0L); + add.setStatus(1L); + validEntityBeforeSave(add); + add.setCreateUnitId(LoginHelper.getBusId()); + add.setCreateUnitNo(LoginHelper.getNo()); + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch(Exception e){ + if(e instanceof DuplicateKeyException){ + bo.setNo(LoginHelper.getNo()+"-"+this.getAgentNo(bo)); + return this.insertByBo(bo); + } + } + + if (flag) { + bo.setId(add.getId()); + } + + SysUnitBo sysUnitBo = new SysUnitBo(); + sysUnitBo.setName(bo.getName()); + sysUnitBo.setId(id); + sysUnitBo.setUnitType(BusRole.AGENT.getId()); + sysUnitBo.setNo(add.getNo()); + sysUnitBo.setCreateBy(add.getCreateBy()); + sysUnitBo.setCreateTime(add.getCreateTime()); + this.sysUnitService.insertByBo(sysUnitBo); + + return flag; + } + + private String getAgentNo(BusChannelBo bo) { + LoginUser user = LoginHelper.getLoginUser(); + int busRole = user.getBusRole().intValue(); + String rno = RandomUtil.randomString("0123456789",5); + if(bo.getDwLevel() != null){ + int level = bo.getDwLevel(); + if(level == 1){ + return "B"+rno; + }else if(level == 2){ + return "C"+rno; + }else if(level == 3){ + return "D"+rno; + } + } + return "CBD"+rno; + + } + + /** + * 修改代理商 + */ + @Override + public Boolean updateByBo(BusChannelBo bo) { + + BusChannelVo channelVo = this.queryById(bo.getId()); + + if(channelVo == null){ + this.invalidationParamsException("代理商不存在!"); + } + + if(channelVo.getVerifyStatus() == null || channelVo.getVerifyStatus().equals(2L)){ + this.invalidationParamsException("代理商信息不能修改!"); + } + bo.setVerifyStatus(0L); + BusChannel update = MapstructUtils.convert(bo, BusChannel.class); + validEntityBeforeSave(update); + update.setUpdateBy(LoginHelper.getUserId()); + update.setUpdateTime(new Date()); + update.setNo(null); + update.setOperatorNo(null); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannel entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public BaseCompInfo getAgentInfo() { + LoginUser user = LoginHelper.getLoginUser(); + Integer busRole = user.getBusRole(); + + BaseCompInfo info = new BaseCompInfo(); + if (busRole == BusRole.AGENT.getId()) { + BusChannelBo bo = new BusChannelBo(); + bo.setNo(LoginHelper.getNo()); + BusChannelVo result = this.baseMapper.selectVoOne(this.buildQueryWrapper(bo)); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.MERCHANT.getId()){ + BusMerchantBo bo = new BusMerchantBo(); + bo.setNo(LoginHelper.getNo()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchant::getNo, bo.getNo()); + BusMerchantVo result= this.busMerchantMapper.selectVoOne(lqw); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.OPERATOR.getId()){ + BusOperatorBo bo = new BusOperatorBo(); + bo.setNo(LoginHelper.getNo()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperator::getNo, bo.getNo()); + BusOperatorVo result = this.busOperatorMapper.selectVoOne(lqw); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.SERVICE.getId()){ + + SysSydVo sysSysVO = this.sysSydMapper.selectVoById(LoginHelper.getBusId()); + if(sysSysVO != null){ + info.setName(sysSysVO.getGsmc()); + info.setAddress(sysSysVO.getAddress()); + info.setXyCode(sysSysVO.getNsrSbh()); + info.setArea(sysSysVO.getUnitAreaName()); + } + } + return info; + } + + @Override + public boolean checkChannel(Long chId, Long checkType, String reason,String domain) { + + if(chId == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + + if(checkType == null){ + this.invalidationParamsException("审核类型不能为空"); + } + + if(checkType.intValue() == 1 && StringUtils.isEmpty(reason)){ + this.invalidationParamsException("驳回原因不能为空"); + } + + if(StringUtils.isEmpty(domain)){ + this.invalidationParamsException("域名不能为空"); + } + + BusChannelVo bcv = this.baseMapper.selectVoById(chId); + + if(bcv == null){ + this.invalidationParamsException("代理商ID无效"); + } + + if(checkType.intValue() == 2){ + + BusChannelAccountBo bcab = new BusChannelAccountBo(); + bcab.setChannelId(chId); + bcab.setIsDefault(1); + bcab.setAddTime(new Date()); + bcab.setCreateTime(new Date()); + bcab.setAccId(0L); + bcab.setSydId(0L); + busChannelAccountService.insertByBo(bcab); + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(chId); + remoteUserBo.setBusNo(bcv.getNo()); + remoteUserBo.setRoleId(BusRole.AGENT.getId()); + remoteUserBo.setRoleName(BusRole.AGENT.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bcv.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bcv.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("B"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addBusUser(remoteUserBo); + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.AGENT.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(domain,remoteUserBo.getPhonenumber(),SmsType.UNIT_OPEN,smsMap); + } + + BusChannel busChannel = new BusChannel(); + + busChannel.setVerifyStatus(checkType); + busChannel.setVerifyReason(reason); + busChannel.setVerifyTime(new Date()); + busChannel.setVerifyBy(LoginHelper.getUserId()+""); + busChannel.setId(chId); + this.baseMapper.updateById(busChannel); + + return true; + } + + private void addBusUser(RemoteUserBo remoteUserBo) { + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("B"+StringUtils.randmNumber(5)); + this.addBusUser(remoteUserBo); + } + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java new file mode 100644 index 0000000..51a7873 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java @@ -0,0 +1,122 @@ +package org.dromara.payment.common.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.service.IBusAccountsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 资金账户汇总 + * 前端访问路由地址为:/payment/accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/busaccounts") +public class BusAccountsController extends BaseController { + + private final IBusAccountsService busAccountsService; + + /** + * 查询资金账户汇总列表 + */ + //@SaCheckPermission("payment:accounts:list") + @GetMapping("/list") + @Log(title = "查询资金账户汇总列表", businessType = BusinessType.OTHER) + public TableDataInfo list(BusAccountsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()|| + loginUser.getBusRole() == BusRole.AGENT.getId() || + loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return new TableDataInfo<>(); + } + return busAccountsService.queryPageList(bo, pageQuery); + } + + /** + * 导出资金账户汇总列表 + */ + @SaCheckPermission("payment:accounts:export") + @Log(title = "资金账户汇总", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusAccountsBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + List list = busAccountsService.queryList(bo); + ExcelUtil.exportExcel(list, "资金账户汇总", BusAccountsVo.class, response); + } + + /** + * 获取资金账户汇总详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:accounts:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busAccountsService.queryById(id)); + } + + /** + * 新增资金账户汇总 + */ + @SaCheckPermission("payment:accounts:add") + @Log(title = "资金账户汇总", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusAccountsBo bo) { + return toAjax(busAccountsService.insertByBo(bo)); + } + + /** + * 修改资金账户汇总 + */ + @SaCheckPermission("payment:accounts:edit") + @Log(title = "资金账户汇总", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusAccountsBo bo) { + return toAjax(busAccountsService.updateByBo(bo)); + } + + /** + * 删除资金账户汇总 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:accounts:remove") + @Log(title = "资金账户汇总", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busAccountsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java new file mode 100644 index 0000000..2922f1a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.common.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.payment.common.service.IBusOperLogService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 业务操作日志 + * 前端访问路由地址为:/payment/operLog + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operLog") +public class BusOperLogController extends BaseController { + + private final IBusOperLogService busOperLogService; + + /** + * 查询业务操作日志列表 + */ + @SaCheckPermission("payment:operLog:list") + @GetMapping("/list") + public TableDataInfo list(BusOperLogBo bo, PageQuery pageQuery) { + return busOperLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出业务操作日志列表 + */ + @SaCheckPermission("payment:operLog:export") + @Log(title = "业务操作日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperLogBo bo, HttpServletResponse response) { + List list = busOperLogService.queryList(bo); + ExcelUtil.exportExcel(list, "业务操作日志", BusOperLogVo.class, response); + } + + /** + * 获取业务操作日志详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperLogService.queryById(id)); + } + + /** + * 新增业务操作日志 + */ + @SaCheckPermission("payment:operLog:add") + @Log(title = "业务操作日志", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperLogBo bo) { + return toAjax(busOperLogService.insertByBo(bo)); + } + + /** + * 修改业务操作日志 + */ + @SaCheckPermission("payment:operLog:edit") + @Log(title = "业务操作日志", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperLogBo bo) { + return toAjax(busOperLogService.updateByBo(bo)); + } + + /** + * 删除业务操作日志 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operLog:remove") + @Log(title = "业务操作日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java new file mode 100644 index 0000000..6f4005a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.common.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.payment.common.service.ITranLogService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 交易记录 + * 前端访问路由地址为:/payment/tranlog + * + * @author LionLi + * @date 2024-04-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tranlog") +public class TranLogController extends BaseController { + + private final ITranLogService tranLogService; + + /** + * 查询交易记录列表 + */ + @SaCheckPermission("payment:tranlog:list") + @GetMapping("/list") + public TableDataInfo list(TranLogBo bo, PageQuery pageQuery) { + return tranLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出交易记录列表 + */ + @SaCheckPermission("payment:tranlog:export") + @Log(title = "交易记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TranLogBo bo, HttpServletResponse response) { + List list = tranLogService.queryList(bo); + ExcelUtil.exportExcel(list, "交易记录", TranLogVo.class, response); + } + + /** + * 获取交易记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:tranlog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tranLogService.queryById(id)); + } + + /** + * 新增交易记录 + */ + @SaCheckPermission("payment:tranlog:add") + @Log(title = "交易记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TranLogBo bo) { + return toAjax(tranLogService.insertByBo(bo)); + } + + /** + * 修改交易记录 + */ + @SaCheckPermission("payment:tranlog:edit") + @Log(title = "交易记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TranLogBo bo) { + return toAjax(tranLogService.updateByBo(bo)); + } + + /** + * 删除交易记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:tranlog:remove") + @Log(title = "交易记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tranLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java new file mode 100644 index 0000000..fb0cd2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java @@ -0,0 +1,121 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 资金账户汇总对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_accounts") +public class BusAccounts extends BaseEntity { + public BusAccounts(){} + + public BusAccounts(Long sydId, Long unitId, Long accId, String bankType, String bankCard, Long isDefault, Date addTime, Integer addYpe,String name, + String khh,String lhh) { + this.sydId = sydId; + this.unitId = unitId; + this.accId = accId; + this.bankType = bankType; + this.bankCard = bankCard; + this.isDefault = isDefault; + this.addTime = addTime; + this.addYpe = addYpe; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + private String name; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 企业id + */ + private Long unitId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + private Integer addYpe; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 备注 + */ + private String remark; + + + private String khh; + + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java new file mode 100644 index 0000000..2a8c9cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java @@ -0,0 +1,67 @@ +package org.dromara.payment.common.domain; + +import lombok.Data; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 业务id基类 + */ +@Data +public class BusId extends BaseEntity { + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + public void bind(BusId bus){ + setSydId(bus.getSydId()); + setSydNo(bus.getSydNo()); + setOpId(bus.getOpId()); + setOpNo(bus.getOpNo()); + setChannelId(bus.getChannelId()); + setChannelNo(bus.getChannelNo()); + setChannelCode(bus.getChannelCode()); + setMerId(bus.getMerId()); + setMerNo(bus.getMerNo()); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java new file mode 100644 index 0000000..f26a31c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java @@ -0,0 +1,65 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 业务操作日志对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_oper_log") +public class BusOperLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperLog(){} + + public BusOperLog(String logDesc, BusRole role, Long busId, Integer busType) { + this.logDesc = logDesc; + this.createRoleId = role.getId(); + this.createRoleName = role.getName(); + this.busId = busId; + this.busType = busType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 日志描述 + */ + private String logDesc; + + /** + * 角色id + */ + private Integer createRoleId; + + /** + * 角色名称 + */ + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + private Integer busType; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java new file mode 100644 index 0000000..cc145da --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java @@ -0,0 +1,70 @@ +package org.dromara.payment.common.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.common.core.utils.DateUtils; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title CommonSelConditionEntity + * @description + * @create 2024-04-26 15:21 + * 业务通用查询条件 + */ + +@Data +public class CommonSelConditionEntity implements Serializable { + + //开始时间 + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + //结束时间 + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + //企业名称 + private String busMerName; + + //服务商名称 + private String synName; + + //用工姓名 + private String workName; + + //工人身份证 + private String workIdCard; + + //用工手机号 + private String workPhone; + + //业务类型 + private Integer busType; + + //签约状态 + private Integer signStatus; + + //完税证明上传状态 + private Integer wsZmStatus; + + private Long merId; + + private Long sydId; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java new file mode 100644 index 0000000..2e4f8cb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java @@ -0,0 +1,127 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 交易记录对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tran_log") +public class TranLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public TranLog(){} + + + public TranLog(Long id, Integer tranResult) { + this.id = id; + this.tranResult = tranResult; + } + + + + public TranLog(Long id, Integer tranResult, Date tranTime) { + this.id = id; + this.tranResult = tranResult; + this.tranTime = tranTime; + } + + /** + * 交易记录id + */ + @TableId(value = "id") + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + private Long busItem; + + /** + * 交易场景 id扣除服务费:任务id 账单付款:账单明细id + */ + private Long buisId; + + /** + * 交易批次 + */ + private String busBatch; + + /** + * 交易id + */ + private Long tranId; + + /** + * 申请交易时间 + */ + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + private Integer tranResult; + + /** + * 待处理批次 + */ + private String tranBatch; + + /** + * 交易完成时间 + */ + private Date tranTime; + + /** + * 付款账户id + */ + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer sourceAccType; + + /** + * 收款账户id + */ + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + private Integer isCallback; + + /** + * 交易订单号 + */ + private String tranNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java new file mode 100644 index 0000000..3d0013d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 资金账户汇总业务对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusAccounts.class, reverseConvertGenerate = false) +public class BusAccountsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 企业id + */ + @NotNull(message = "企业id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long unitId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型 + */ + @NotBlank(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + @NotNull(message = "状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + @NotNull(message = "开户类型(0:系统 6:服务商 9:商户 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer addYpe; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java new file mode 100644 index 0000000..f11fa99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java @@ -0,0 +1,60 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 业务操作日志业务对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperLog.class, reverseConvertGenerate = false) +public class BusOperLogBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 日志描述 + */ + @NotBlank(message = "日志描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logDesc; + + /** + * 角色id + */ + @NotNull(message = "角色id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long createRoleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + @NotNull(message = "业务id(任务id或账单批次id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + @NotNull(message = "业务类型(1:项目 2:账单批次)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java new file mode 100644 index 0000000..dbad4a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java @@ -0,0 +1,124 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 交易记录业务对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TranLog.class, reverseConvertGenerate = false) +public class TranLogBo extends BaseEntity { + + /** + * 交易记录id + */ + @NotNull(message = "交易记录id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + @NotNull(message = "交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + @NotNull(message = "交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + @NotNull(message = "交易场景id 扣除服务费:任务id 账单付款:账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long buisId; + + /** + * 交易批次 + */ + @NotBlank(message = "交易批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busBatch; + + /** + * 交易id + */ + @NotNull(message = "交易id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long tranId; + + /** + * 申请交易时间 + */ + @NotNull(message = "申请交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + @NotNull(message = "交易结果(-1:待处理 1:支付中 2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranResult; + + /** + * 待处理批次 + */ + @NotBlank(message = "待处理批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranBatch; + + /** + * 交易完成时间 + */ + @NotNull(message = "交易完成时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date tranTime; + + /** + * 付款账户id + */ + @NotNull(message = "付款账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer sourceAccType; + + /** + * 收款账户id + */ + @NotNull(message = "收款账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + @NotBlank(message = "交易号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + @NotNull(message = "回执状态(0:待回置 1:已回置)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isCallback; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java new file mode 100644 index 0000000..2ff7667 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.common.domain.RemoteBusAccountsVo; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 资金账户汇总Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusAccountsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java new file mode 100644 index 0000000..f509002 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.common.api.domain.RemoteBusOperLogVo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 业务操作日志Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperLogVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java new file mode 100644 index 0000000..a27ba49 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.common.api.domain.RemoteTranLogVo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 交易记录Convert接口 + * + * @author LionLi + * @date 2024-04-11 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface TranLogVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java new file mode 100644 index 0000000..1509c11 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java @@ -0,0 +1,150 @@ +package org.dromara.payment.common.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusAccounts; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 资金账户汇总视图对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusAccounts.class) +public class BusAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 企业id + */ + @ExcelProperty(value = "企业id") + private Long unitId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型 + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未开通,1=:开通成功,2=:冻结,3=:开通中,4=:开通失败") + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + @ExcelProperty(value = "开户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:系统,6=:服务商,9=:商户") + private Integer addYpe; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String unitName; + + /** + * 企业编号 + */ + @ExcelProperty(value = "企业编号") + private String unitNo; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户") + private String unitType; + + /** + * 平台客户号 + */ + @ExcelProperty(value = "平台客户号") + private String custNo; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java new file mode 100644 index 0000000..23669ba --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java @@ -0,0 +1,71 @@ +package org.dromara.payment.common.domain.vo; + +import org.dromara.payment.common.domain.BusOperLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 业务操作日志视图对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperLog.class) +public class BusOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 日志描述 + */ + @ExcelProperty(value = "日志描述") + private String logDesc; + + /** + * 角色id + */ + @ExcelProperty(value = "角色id") + private Long createRoleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String createRoleName; + + private Date createTime; + + /** + * 业务id(任务id或账单批次id) + */ + @ExcelProperty(value = "业务id(任务id或账单批次id)") + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:项目,2=:账单批次") + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java new file mode 100644 index 0000000..d1116b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java @@ -0,0 +1,141 @@ +package org.dromara.payment.common.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.TranLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 交易记录视图对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TranLog.class) +public class TranLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易记录id + */ + @ExcelProperty(value = "交易记录id") + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + @ExcelProperty(value = "交易场景", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:任务,2=:账单,3=:代理商提现,4=:运营商提现,5=:服务商提现,6=:商户提现") + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + @ExcelProperty(value = "交易项", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:商户转账到服务商B2B,2=:服务商转账到运营商,3=:服务商转账到平台,4=:服务商转账到个人B2C,5=:提现") + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + @ExcelProperty(value = "交易场景id 扣除服务费:任务id 账单付款:账单明细id") + private Long buisId; + + /** + * 交易批次 + */ + @ExcelProperty(value = "交易批次") + private String busBatch; + + /** + * 交易id + */ + @ExcelProperty(value = "交易id") + private Long tranId; + + /** + * 申请交易时间 + */ + @ExcelProperty(value = "申请交易时间") + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + @ExcelProperty(value = "交易结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "-=1:待处理,1=:支付中,2=:成功,3=:失败") + private Integer tranResult; + + /** + * 待处理批次 + */ + @ExcelProperty(value = "待处理批次") + private String tranBatch; + + /** + * 交易完成时间 + */ + @ExcelProperty(value = "交易完成时间") + private Date tranTime; + + /** + * 付款账户id + */ + @ExcelProperty(value = "付款账户id") + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer sourceAccType; + + /** + * 收款账户id + */ + @ExcelProperty(value = "收款账户id") + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + @ExcelProperty(value = "交易号(银行流水号)") + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + @ExcelProperty(value = "回执状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待回置,1=:已回置") + private Integer isCallback; + + /** + * 交易订单号 + */ + private String tranNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java new file mode 100644 index 0000000..d8306f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java @@ -0,0 +1,65 @@ +package org.dromara.payment.common.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydAccount; + +import java.util.List; + +/** + * 资金账户汇总Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusAccountsMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + public int insertSelective(BusAccounts account); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("unitId") long unitId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("unitId") long unitId,@Param("amount") long amount,@Param("bankType") String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId, @Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java new file mode 100644 index 0000000..892aeee --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.common.mapper; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 业务操作日志Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java new file mode 100644 index 0000000..f60a276 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java @@ -0,0 +1,68 @@ +package org.dromara.payment.common.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 交易记录Mapper接口 + * + * @author LionLi + * @date 2024-04-11 + */ +public interface TranLogMapper extends BaseMapperPlus { + /** + * 查询交易记录 + * @author 张涛 + * @date 2021年9月7日 + * @param batch 交易批次 + * @param result 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + * @param isCallback 回执状态(0:待回置 1:已回置) + * @param size 数量 + * @return + */ + public List selectTranLog(@Param("batch") String batch, @Param("result") int result, @Param("isCallback") Byte isCallback, @Param("size") Integer size); + + /** + * 根据业务场景查询交易记录 + * @author 张涛 + * @date 2021年9月8日 + * @param busType 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + * @param buisId 交易场景id + * @param busItem 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + * @param busBatch 交易批次 + * @param tranResult 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + * @return + */ + public List selectByBus(@Param("busType") int busType,@Param("buisId") int buisId,@Param("busItem") String busItem,@Param("busBatch") String busBatch,@Param("tranResult") String tranResult); + + /** + * 分配交易的处理批次 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @return + */ + public Integer allotSyns(@Param("synBatch") String synBatch,@Param("result") int result,@Param("isCallback") Byte isCallback,@Param("minId") long minId,@Param("start") int start,@Param("size") int size); + + /** + * 取消交易处理 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer cancelSyn(@Param("id") long id); + + /** + * 取消指定批次所有交易处理 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次 + * @return + */ + public Integer cancelSynByBatch(@Param("synBatch") String synBatch,@Param("result") int result); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java new file mode 100644 index 0000000..3e31de5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 资金账户汇总Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusAccountsService { + + /** + * 查询资金账户汇总 + */ + BusAccountsVo queryById(Long id); + + /** + * 查询资金账户汇总列表 + */ + TableDataInfo queryPageList(BusAccountsBo bo, PageQuery pageQuery); + + /** + * 查询资金账户汇总列表 + */ + List queryList(BusAccountsBo bo); + + /** + * 新增资金账户汇总 + */ + Boolean insertByBo(BusAccountsBo bo); + + /** + * 修改资金账户汇总 + */ + Boolean updateByBo(BusAccountsBo bo); + + /** + * 校验并批量删除资金账户汇总信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java new file mode 100644 index 0000000..6801518 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 业务操作日志Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusOperLogService { + + /** + * 查询业务操作日志 + */ + BusOperLogVo queryById(Long id); + + /** + * 查询业务操作日志列表 + */ + TableDataInfo queryPageList(BusOperLogBo bo, PageQuery pageQuery); + + /** + * 查询业务操作日志列表 + */ + List queryList(BusOperLogBo bo); + + /** + * 新增业务操作日志 + */ + Boolean insertByBo(BusOperLogBo bo); + + /** + * 修改业务操作日志 + */ + Boolean updateByBo(BusOperLogBo bo); + + /** + * 校验并批量删除业务操作日志信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java new file mode 100644 index 0000000..2cdd8e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java @@ -0,0 +1,71 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 交易记录Service接口 + * + * @author LionLi + * @date 2024-04-11 + */ +public interface ITranLogService { + + /** + * 查询交易记录 + */ + TranLogVo queryById(Long id); + + /** + * 查询交易记录列表 + */ + TableDataInfo queryPageList(TranLogBo bo, PageQuery pageQuery); + + /** + * 查询交易记录列表 + */ + List queryList(TranLogBo bo); + + /** + * 新增交易记录 + */ + Boolean insertByBo(TranLogBo bo); + + /** + * 修改交易记录 + */ + Boolean updateByBo(TranLogBo bo); + + /** + * 校验并批量删除交易记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 处理交易 + * @param accid 交易记录 + * @param syn 是否只同步结果 + * @return + */ + boolean transaction(TranLogVo accid,boolean syn); + + /** + * 解锁交易账户 + * @param accid 交易记录 + * @return + */ + boolean unlockTransaction(TranLogVo accid); + + /** + * 同步交易回置单 + * @param accid 交易记录 + * @return + */ + boolean synTransferCallBack(TranLogVo accid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java new file mode 100644 index 0000000..841784c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java @@ -0,0 +1,137 @@ +package org.dromara.payment.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.common.service.IBusAccountsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 资金账户汇总Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusAccountsServiceImpl implements IBusAccountsService { + + private final BusAccountsMapper baseMapper; + + /** + * 查询资金账户汇总 + */ + @Override + public BusAccountsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询资金账户汇总列表 + */ + @Override + public TableDataInfo queryPageList(BusAccountsBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询资金账户汇总列表 + */ + @Override + public List queryList(BusAccountsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusAccountsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getUnitId() != null, "t.unit_id", bo.getUnitId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getBalance() != null, "t.balance", bo.getBalance()); + lqw.eq(bo.getFrozen() != null, "t.frozen", bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, "t.is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getAddYpe() != null, "t.add_ype", bo.getAddYpe()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), "t.out_bank_card", bo.getOutBankCard()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("cust_no"))){ + lqw.eq("t1.cust_no",bo.getParams().get("cust_no")); + } + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增资金账户汇总 + */ + @Override + public Boolean insertByBo(BusAccountsBo bo) { + BusAccounts add = MapstructUtils.convert(bo, BusAccounts.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改资金账户汇总 + */ + @Override + public Boolean updateByBo(BusAccountsBo bo) { + BusAccounts update = MapstructUtils.convert(bo, BusAccounts.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusAccounts entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除资金账户汇总 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java new file mode 100644 index 0000000..abebf20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java @@ -0,0 +1,113 @@ +package org.dromara.payment.common.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.common.service.IBusOperLogService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 业务操作日志Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusOperLogServiceImpl implements IBusOperLogService { + + private final BusOperLogMapper baseMapper; + + /** + * 查询业务操作日志 + */ + @Override + public BusOperLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询业务操作日志列表 + */ + @Override + public TableDataInfo queryPageList(BusOperLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询业务操作日志列表 + */ + @Override + public List queryList(BusOperLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperLogBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getLogDesc()), BusOperLog::getLogDesc, bo.getLogDesc()); + lqw.eq(bo.getCreateRoleId() != null, BusOperLog::getCreateRoleId, bo.getCreateRoleId()); + lqw.like(StringUtils.isNotBlank(bo.getCreateRoleName()), BusOperLog::getCreateRoleName, bo.getCreateRoleName()); + lqw.eq(bo.getBusId() != null, BusOperLog::getBusId, bo.getBusId()); + lqw.eq(bo.getBusType() != null, BusOperLog::getBusType, bo.getBusType()); + return lqw; + } + + /** + * 新增业务操作日志 + */ + @Override + public Boolean insertByBo(BusOperLogBo bo) { + BusOperLog add = MapstructUtils.convert(bo, BusOperLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改业务操作日志 + */ + @Override + public Boolean updateByBo(BusOperLogBo bo) { + BusOperLog update = MapstructUtils.convert(bo, BusOperLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除业务操作日志 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..d2d06ff --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.payment.common.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java new file mode 100644 index 0000000..427efc6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java @@ -0,0 +1,280 @@ +package org.dromara.payment.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 交易记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-11 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class TranLogServiceImpl implements ITranLogService { + + private final TranLogMapper baseMapper; + + private final SysSydAccountMapper sydAccountDao; + + private final BusOperatorAccountMapper busOperatorAccountMapper; + + private final BusMerchantAccountMapper accountDao; + + private final IMerBillService billService; + + private final ISysSydCashoutService sydCashoutService; + + private final IBusMerchantCashoutService merchantCashoutService; + + private final IBusChannelCashoutService channelCashoutService; + + private final IBusOperatorCashoutService operatorCashoutService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询交易记录 + */ + @Override + public TranLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询交易记录列表 + */ + @Override + public TableDataInfo queryPageList(TranLogBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询交易记录列表 + */ + @Override + public List queryList(TranLogBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(TranLogBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(bo.getBusItem() != null, "bus_item", bo.getBusItem()); + lqw.eq(bo.getBuisId() != null, "buis_id", bo.getBuisId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusBatch()), "bus_batch", bo.getBusBatch()); + lqw.eq(bo.getTranId() != null, "tran_id", bo.getTranId()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(bo.getTranResult() != null, "tran_result", bo.getTranResult()); + lqw.eq(StringUtils.isNotBlank(bo.getTranBatch()), "tran_batch", bo.getTranBatch()); + lqw.eq(bo.getTranTime() != null, "tran_time", bo.getTranTime()); + lqw.eq(bo.getSourceAccId() != null, "source_acc_id", bo.getSourceAccId()); + lqw.eq(bo.getSourceAccType() != null, "source_acc_type", bo.getSourceAccType()); + lqw.eq(bo.getTargetAccId() != null, "target_acc_id", bo.getTargetAccId()); + lqw.eq(bo.getTargetAccType() != null, "target_acc_type", bo.getTargetAccType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), "bank_no", bo.getBankNo()); + lqw.eq(bo.getIsCallback() != null, "is_callback", bo.getIsCallback()); + return lqw; + } + + /** + * 新增交易记录 + */ + @Override + public Boolean insertByBo(TranLogBo bo) { + TranLog add = MapstructUtils.convert(bo, TranLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改交易记录 + */ + @Override + public Boolean updateByBo(TranLogBo bo) { + TranLog update = MapstructUtils.convert(bo, TranLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TranLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除交易记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean synTransferCallBack(TranLogVo tlog) { + Result rtn = accountService.getTransferBankNo(tlog.getTranId()); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易流水号出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易流水号:"+rtn.getResult()); + }else if (StringUtils.isNotBlank(rtn.getRtnData())) { + tlog.setBankNo(rtn.getRtnData()); + rtn = accountService.getTransferCallBack(tlog.getTranId()); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易回置单出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易回置单结果:"+rtn.getResult()); + }else if (StringUtils.isNotBlank(rtn.getRtnData())) { + if (tlog.getBusType() == 2) {//账单 + billService.billTransactionCallback(tlog,rtn.getRtnData()); + } + if (StringUtils.isNotBlank(tlog.getBankNo())) { + TranLog upd = new TranLog(); + upd.setId(tlog.getId()); + upd.setBankNo(tlog.getBankNo()); + upd.setIsCallback(1); + baseMapper.updateById(upd); + } + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean transaction(TranLogVo accid,boolean syn) { + boolean lock = false; + if(accid.getSourceAccType() == BusRole.SERVICE.getId()){ + lock = sydAccountDao.lock(accid.getSourceAccId().intValue()) > 0; + }else if (accid.getSourceAccType() == BusRole.MERCHANT.getId()){ + lock = accountDao.lock(accid.getSourceAccId().intValue()) > 0; + }else if(accid.getSourceAccType() == BusRole.OPERATOR.getId()){ + lock = this.busOperatorAccountMapper.lock(accid.getSourceAccId().intValue()) > 0; + } + + if(lock) { + Result rtn = null; + if (syn){ + rtn = accountService.synTransfer(accid.getTranId()); + log.info("查询交易返回结果==>"+accid.getTranId()+","+JsonUtils.toJsonString(rtn)); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易结果出错(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易结果提示(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } + if(rtn.getRtnData().getResult() == -1) { + //需要重新发起支付 + rtn.getRtnData().setResult((short)4); + } + }else { + rtn = accountService.transfer(accid.getTranId()); + log.info("交易返回结果==>"+accid.getTranId()+","+JsonUtils.toJsonString(rtn)); + if (rtn.hasError()) { + throw new ServiceException("银行交易出错(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } else if (rtn.hasTip()) { + throw new ServiceException("银行交易提示(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } + } + if (rtn.getRtnData() != null && rtn.getRtnData().getResult() > 0) { + TranLog save = null; + if(rtn.getRtnData().getResult() == 4) {//重新发起支付 + save = new TranLog(accid.getId(),-1); + }else if (rtn.getRtnData().getResult() == 1) {//支付中 + if(accid.getTranResult() < 1) { + save = new TranLog(accid.getId(), 1); + } + }else { + if (accid.getBusType() == 2) {//账单 + save = billService.billTransaction(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 5) {//服务商提现 + save = sydCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 6) {//商户提现 + save = merchantCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 3) {//代理商提现 + save = channelCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 4) {//运营商提现 + save = operatorCashoutService.cashoutResult(accid, rtn.getRtnData()); + } + } + if (save != null) { + save.setBankNo(rtn.getRtnData().getTargetBankNo()); + baseMapper.updateById(save); + } + } + unlockTransaction(accid); + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean unlockTransaction(TranLogVo accid) { + if(accid.getSourceAccType() == BusRole.SERVICE.getId()){ + sydAccountDao.update(new LambdaUpdateWrapper().eq(SysSydAccount::getAccId,accid.getSourceAccId()) + .set(SysSydAccount::getStatus,1)); + }else if (accid.getSourceAccType() == BusRole.MERCHANT.getId()){ + accountDao.update(new LambdaUpdateWrapper().eq(BusMerchantAccount::getAccId,accid.getSourceAccId()) + .set(BusMerchantAccount::getStatus,1)); + }else if(accid.getSourceAccType() == BusRole.OPERATOR.getId()){ + busOperatorAccountMapper.update(new LambdaUpdateWrapper().eq(BusOperatorAccount::getAccId,accid.getSourceAccId()) + .set(BusOperatorAccount::getStatus,1)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java new file mode 100644 index 0000000..68d9572 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java @@ -0,0 +1,124 @@ +package org.dromara.payment.consumer; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.service.ISysSydService; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +@Slf4j +@Component +@RequiredArgsConstructor +public class BankAccountStreamConsumer { + private final ISysSydService sydService; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final BusMerchantMapper merchantMapper; + + @Bean + Consumer account2() { + log.info("订阅资金账户生成队列"); + return msg -> { + log.info("通过stream消费到资金账户生成消息 => {}", msg); + if (msg == null) { + return; + } + try { + Long unitId = null; + String gsmc = null; + Function saveFun = null; + Function existsFun = null; + if(msg.getInteger("accType") == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo vo = operatorMapper.selectVoById(msg.getInteger("accUnitId")); + if(vo != null){ + unitId = vo.getId(); + gsmc = vo.getName(); + } + saveFun = add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = operatorAccountMapper.insertAccount(new BusOperatorAccount(add.getId(),add.getUnitId(), add.getAccId(), add.getBankType(), add.getBankCard(), add.getBalance(),0l, (long)1, add.getAddTime(),add.getName(),add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }; + existsFun = bankType -> { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperatorAccount::getOpId,vo.getId()); + lqw.eq(BusOperatorAccount::getBankType,bankType); + List accs = operatorAccountMapper.selectVoList(lqw); + return accs.size() > 0 ? accs.get(0).getBankVirtualCard() : null; + }; + }else if(msg.getInteger("accType") == BusRole.MERCHANT.getId()){ + //商户 + BusMerchantVo vo = merchantMapper.selectVoById(msg.getInteger("accUnitId")); + if(vo != null){ + unitId = vo.getId(); + gsmc = vo.getName(); + } + saveFun = add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = merchantAccountMapper.insertAccount(new BusMerchantAccount(null,add.getId(),add.getUnitId(), add.getAccId(), add.getBankType(), add.getBankCard(), add.getBalance(),0l, (long)1, add.getAddTime(),add.getName(),add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }; + existsFun = bankType -> { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusMerchantAccount::getMerId,vo.getId()); + lqw.eq(BusMerchantAccount::getBankType,bankType); + List accs = merchantAccountMapper.selectVoList(lqw); + return accs.size() > 0 ? accs.get(0).getBankVirtualCard() : null; + }; + } + String sydIds = msg.getString("sydIds"); + if(unitId == null || StringUtils.isBlank(gsmc) || StringUtils.isBlank(sydIds)){ + throw new ServiceException("账户类型不支持"); + } + String[] sydIdArr = sydIds.split(","); + for (String sydId:sydIdArr + ) { + sydService.creatXNnum(Long.parseLong(sydId),unitId,gsmc,msg.getInteger("accType"),msg.getInteger("addAccType"), saveFun, existsFun); + } + } catch (Exception e) { + log.error("资金账户生成出错:("+msg+")",e); + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java new file mode 100644 index 0000000..3b88a89 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java @@ -0,0 +1,99 @@ +package org.dromara.payment.consumer; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +@Slf4j +@Component +@RequiredArgsConstructor +public class BillPayStreamConsumer { + + private final IMerBillService billService; + + private final IMerBillDetailService billDetailService; + + @Bean + Consumer bill() { + log.info("订阅代发任务队列"); + return param -> { + log.info("通过stream消费到代发任务消息 => {}", param); + if (!param.containsKey("billId") && !param.containsKey("billDetailId")) { + return; + } + Long billId = param.getLong("billId"); + Long billDetailId = null; + try { + if(param.containsKey("billDetailId")){ + billDetailId = param.getLong("billDetailId"); + billService.paymentToWorker(billDetailId.intValue()); + }else{ + billService.paymentToService(billId.intValue()); + } + } catch (Exception e) { + String errorType = "代发任务"; + if(e instanceof ServiceException){ + ServiceException ex = (ServiceException) e; + errorType += "-" + ex.getDetailMessage(); + try { + billDetailService.failBillDetail(billId,billDetailId,ex.getMessage(),0,null); + } catch (Exception exc) { + log.error("保存"+errorType+"失败结果出错:("+param.toJSONString()+")",exc); + } + } + log.error(errorType+"出错:("+param.toJSONString()+")",e); + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java new file mode 100644 index 0000000..9fc862e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java @@ -0,0 +1,46 @@ +package org.dromara.payment.coverpage.controller; + +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.service.ICoverPageService; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * @Title CoverPageController + * @Description 首页接口 + * @Author wuchuang + * @Date 2024/5/29 16:12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cover") +public class CoverPageController extends BaseController { + + private final ICoverPageService coverPageService; + + /** + * 获取首页 金额信息 + * + */ +// @SaCheckPermission("payment:task:query") + @GetMapping("/getCoverInfo") + public R getCoverInfo(CoverPageBo bo) { + return R.ok(coverPageService.getCoverInfo(bo)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java new file mode 100644 index 0000000..99d6f32 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java @@ -0,0 +1,29 @@ +package org.dromara.payment.coverpage.domain; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.task.domain.MerTask; + +/** + * @Title CoverPageBo + * @Description + * @Author wuchuang + * @Date 2024/6/3 10:25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTask.class, reverseConvertGenerate = false) +public class CoverPageBo extends BaseEntity { + + private Long merId; + + private Long sydId; + + private Long opId; + + private Long channelId; + + private String channelNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java new file mode 100644 index 0000000..84d02eb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java @@ -0,0 +1,74 @@ +package org.dromara.payment.coverpage.domain; + +import lombok.Data; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.util.MoneyUtils; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @Title CoverPageInfo + * @Description + * @Author wuchuang + * @Date 2024/5/30 14:00 + */ +@Data +public class CoverPageInfo { + + + + private Long availableFee ;//账户可用余额(分) 可用收益余额(元) + + private Long monthTransactionAmount ;//本月代发总额(分) + private Long monthTransactionNumber ;//本月代发笔数(笔) + private Long dayTransactionAmount ;//今日交易(元) + + private Long dayTransactionNumber ;//今日交易笔数(笔) + + private Long yingshouFee ;//应收余额(元) + + private String[] days ; //最近30天交易统计图(万元) + + private BigDecimal[] costs;//最近30天交易统计图(万元) + + private List merBillList;//企业交易数据 + + + private int waitTask; + + private int waitBill; + + private int waitInvoice; + + private int waitTax; + + + private Long id; + + private Long merId; + + private Long sydId; + + private Long opId; + + private Long channelId; + + + public BigDecimal getAvailableFee() { + return MoneyUtils.getMoneyYuan(availableFee); + } + + + public BigDecimal getMonthTransactionAmount() { + return MoneyUtils.getMoneyYuan(monthTransactionAmount); + } + + public BigDecimal getDayTransactionAmount() { + return MoneyUtils.getMoneyYuan(dayTransactionAmount); + } + + public BigDecimal getYingshouFee() { + return MoneyUtils.getMoneyYuan(yingshouFee); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java new file mode 100644 index 0000000..5ec4636 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java @@ -0,0 +1,51 @@ +package org.dromara.payment.coverpage.domain; + +import lombok.Data; +import org.dromara.payment.util.MoneyUtils; + +import java.math.BigDecimal; + +/** + * @Title MerBillInfo + * @Description + * @Author wuchuang + * @Date 2024/5/31 9:33 + */ +@Data +public class MerBillInfo { + + private String name; + + private String payTime; + + private Long amountEnt; + + private Long merId; + + private Long yearTransactionAmount ;//年代发总额(分) + private Long yearTransactionNumber ;//年代发笔数(笔) + + private Long monthTransactionAmount ;//本月代发总额(分) + private Long monthTransactionNumber ;//本月代发笔数(笔) + private Long dayTransactionAmount ;//今日交易(元) + + private Long dayTransactionNumber ;//今日交易笔数(笔) + + public BigDecimal getAmountEnt() { + return MoneyUtils.getMoneyYuan(amountEnt); + } + + public BigDecimal getYearTransactionAmount() { + return MoneyUtils.getMoneyYuan(yearTransactionAmount); + } + + public BigDecimal getMonthTransactionAmount() { + return MoneyUtils.getMoneyYuan(monthTransactionAmount); + } + + public BigDecimal getDayTransactionAmount() { + return MoneyUtils.getMoneyYuan(dayTransactionAmount); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java new file mode 100644 index 0000000..22d2638 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java @@ -0,0 +1,32 @@ +package org.dromara.payment.coverpage.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.domain.MerBillInfo; + +import java.util.List; + +/** + * @Title CoverPageMapper + * @Description + * @Author wuchuang + * @Date 2024/5/31 10:35 + */ +public interface CoverPageMapper { + + CoverPageInfo selectMerCountInfo(@Param("merId") Long merId, @Param("sydId") Long sydId); + + CoverPageInfo selectOpCountInfo(@Param("opId") Long busId); + + CoverPageInfo selectChannelCountInfo(@Param("channelId") Long busId,@Param("channelNo")String busNo); + + CoverPageInfo selectSydCountInfo(@Param("sydId") Long busId); + + List selectMerTransactionListById(CoverPageBo bo); + + List select30DaysById(CoverPageBo bo); + + + CoverPageInfo selectAllCountInfo(); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java new file mode 100644 index 0000000..1f6677e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java @@ -0,0 +1,15 @@ +package org.dromara.payment.coverpage.service; + +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; + +/** + * @Title ICoverPageService + * @Description + * @Author wuchuang + * @Date 2024/5/30 13:56 + */ +public interface ICoverPageService { + + CoverPageInfo getCoverInfo(CoverPageBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java new file mode 100644 index 0000000..8068eb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.payment.coverpage.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.domain.MerBillInfo; +import org.dromara.payment.coverpage.mapper.CoverPageMapper; +import org.dromara.payment.coverpage.service.ICoverPageService; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.util.DateTimeUtil; +import org.dromara.payment.util.MoneyUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +/** + * @Title CoverPageServiceImpl + * @Description + * @Author wuchuang + * @Date 2024/5/30 13:56 + */ +@RequiredArgsConstructor +@Service +public class CoverPageServiceImpl implements ICoverPageService { + + + @Resource + private final CoverPageMapper coverPageMapper; + + @Override + public CoverPageInfo getCoverInfo(CoverPageBo bo) { + + CoverPageInfo info = new CoverPageInfo(); + //根据角色不同 查询不同得数据 + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + info = coverPageMapper.selectMerCountInfo(LoginHelper.getBusId(), bo.getSydId() ); + }else if(busRole == BusRole.OPERATOR.getId() ){ + info = coverPageMapper.selectOpCountInfo(LoginHelper.getBusId()); + + bo.setOpId(LoginHelper.getBusId()); + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + + }else if(busRole == BusRole.AGENT.getId() ){ + info = coverPageMapper.selectChannelCountInfo(LoginHelper.getBusId(),LoginHelper.getNo()); + //企业交易量汇总统计 + bo.setChannelId(LoginHelper.getBusId()); + bo.setChannelNo(LoginHelper.getNo()); + + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + + + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + }else if(busRole == BusRole.SERVICE.getId() ){ + info = coverPageMapper.selectSydCountInfo(LoginHelper.getBusId()); + + + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + info = coverPageMapper.selectAllCountInfo(); + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + } + + return info; + } + + private void dealLineData(List dayList, CoverPageInfo info) { + List days = + DateTimeUtil.getDateList(DateTimeUtil.getPreviousMonthSameTime(DateTimeUtil.formatNow("yyyy-MM-dd HH:mm:ss")), + DateTimeUtil.formatNow("yyyy-MM-dd HH:mm:ss"),3,DateTimeUtil.YYYY_MM_DD); + info.setDays(days.toArray(new String[days.size()])); + + Map> grop + = dayList.stream().filter(iem -> isNotBlank(iem.getPayTime()) ) + .collect(Collectors.groupingBy(MerBillInfo::getPayTime)); + + List costList = new ArrayList<>(); + for(String day : days){ + if(null == grop.get(day)){ + costList.add(new BigDecimal("0.00")); + }else{ + costList.add(MoneyUtils.getMoneyWan(grop.get(day).get(0).getAmountEnt())); + } + } + + info.setCosts(costList.toArray(new BigDecimal[costList.size()])); + + } + + /** + * 判断角色查询条件 拒绝全部数据输出 + */ + private void valQueryContion(MerBillBo bo) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + }else if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId() ){ + bo.setChannelId(LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java new file mode 100644 index 0000000..f7ad7ec --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java @@ -0,0 +1,116 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.payment.invoice.service.IMerInvoiceAddressService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票地址 + * 前端访问路由地址为:/payment/invoiceAddress + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceAddress") +public class MerInvoiceAddressController extends BaseController { + + private final IMerInvoiceAddressService merInvoiceAddressService; + + /** + * 查询发票地址列表 + */ + //@SaCheckPermission("payment:invoiceAddress:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceAddressBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + return merInvoiceAddressService.queryPageList(bo, pageQuery); + } + + /** + * 导出发票地址列表 + */ + @SaCheckPermission("payment:invoiceAddress:export") + @Log(title = "发票地址", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceAddressBo bo, HttpServletResponse response) { + List list = merInvoiceAddressService.queryList(bo); + ExcelUtil.exportExcel(list, "发票地址", MerInvoiceAddressVo.class, response); + } + + /** + * 获取发票地址详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceAddress:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceAddressService.queryById(id)); + } + + /** + * 新增发票地址 + */ + //@SaCheckPermission("payment:invoiceAddress:add") + @Log(title = "发票地址", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceAddressBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + bo.setMerNo(loginUser.getBusNo()); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceAddressService.insertByBo(bo)); + } + + /** + * 修改发票地址 + */ + //@SaCheckPermission("payment:invoiceAddress:edit") + @Log(title = "发票地址", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceAddressBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + return toAjax(merInvoiceAddressService.updateByBo(bo)); + } + + /** + * 删除发票地址 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceAddress:remove") + @Log(title = "发票地址", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceAddressService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java new file mode 100644 index 0000000..2930b0c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.service.IMerInvoiceBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票明细 + * 前端访问路由地址为:/payment/invoiceBill + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceBill") +public class MerInvoiceBillController extends BaseController { + + private final IMerInvoiceBillService merInvoiceBillService; + + /** + * 查询发票明细列表 + */ + //@SaCheckPermission("payment:invoiceBill:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceBillBo bo, PageQuery pageQuery) { + return merInvoiceBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出发票明细列表 + */ + @SaCheckPermission("payment:invoiceBill:export") + @Log(title = "发票明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceBillBo bo, HttpServletResponse response) { + List list = merInvoiceBillService.queryList(bo); + ExcelUtil.exportExcel(list, "发票明细", MerInvoiceBillVo.class, response); + } + + /** + * 获取发票明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceBill:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceBillService.queryById(id)); + } + + /** + * 新增发票明细 + */ + @SaCheckPermission("payment:invoiceBill:add") + @Log(title = "发票明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceBillBo bo) { + return toAjax(merInvoiceBillService.insertByBo(bo)); + } + + /** + * 修改发票明细 + */ + @SaCheckPermission("payment:invoiceBill:edit") + @Log(title = "发票明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceBillBo bo) { + return toAjax(merInvoiceBillService.updateByBo(bo)); + } + + /** + * 删除发票明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceBill:remove") + @Log(title = "发票明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceBillService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java new file mode 100644 index 0000000..2737752 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java @@ -0,0 +1,268 @@ +package org.dromara.payment.invoice.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 商户发票记录 + * 前端访问路由地址为:/payment/invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoice") +public class MerInvoiceController extends BaseController { + + private final IMerInvoiceService merInvoiceService; + + private final IMerBillService billService; + + private void bindDataPermission(MerInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 查询开票记录列表 + */ + //@SaCheckPermission("payment:invoice:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return merInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 查询快递发票记录列表 + */ + @GetMapping("/iogisticsList") + public TableDataInfo iogisticsList(MerInvoiceBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + bo.setStatus(2);//已开票 + return merInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 查询可开票代发批次列表 + * @param bo + * @param pageQuery + * @return + */ + @GetMapping("/canInvoicingList") + public TableDataInfo canInvoicingList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId() + || loginUser.getBusRole() == BusRole.SERVICE.getId()){ + return new TableDataInfo(); + } + if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + bo.setStatus(3l); + bo.setPayStatus(1l); + bo.setIsInvoice(0); + TableDataInfo rtn = billService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0) { + rtn.setRows(rtn.getRows().stream().peek(b -> b.setRemark("灵工业务")).collect(Collectors.toList())); + } + return rtn; + } + + /** + * 导出商户发票记录列表 + */ + //@SaCheckPermission("payment:invoice:export") + @Log(title = "商户发票记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = merInvoiceService.queryList(bo); + ExcelUtil.exportExcel(list, "商户发票记录", MerInvoiceVo.class, response); + } + + /** + * 获取商户发票记录详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:invoice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceService.queryById(id)); + } + + + /** + * 获取商户发票记录详细信息 + * @param no 发票记录编码 + */ + //@SaCheckPermission("payment:invoice:query") + @GetMapping("/getInfo/{no}") + public R getInfo(@NotNull(message = "发票记录编码不能为空") + @PathVariable String no) { + return R.ok(merInvoiceService.queryByNo(no)); + } + /** + * 新增商户发票记录 + */ + //@SaCheckPermission("payment:invoice:add") + @Log(title = "商户发票记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceService.insertByBo(bo)); + } + + /** + * 修改商户发票记录 + */ +// @SaCheckPermission("payment:invoice:edit") + @Log(title = "商户发票记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceBo bo) { + return toAjax(merInvoiceService.updateByBo(bo)); + } + + + + @Log(title = "更新快递信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editKd") + public R editKd(Long id ,String iogisticsCompany,String iogisticsNo) { + MerInvoiceBo mbo = new MerInvoiceBo(); + mbo.setId(id); + mbo.setIogisticsCompany(iogisticsCompany); + mbo.setIogisticsNo(iogisticsNo); + mbo.setIogisticsStatus(2); + mbo.setUpdateTime(new Date()); + mbo.setUpdateBy(LoginHelper.getUserId()); + return toAjax(merInvoiceService.updateByBo(mbo)); + } + + /** + * 删除商户发票记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoice:remove") + @Log(title = "商户发票记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 服务商驳回发票申请 + * @param id 发票申请id + * @param remark 驳回备注 + * @return + */ + @Log(title = "服务商驳回发票申请", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/reject") + public R reject(long id,String remark) { + LoginUser loginUser = LoginHelper.getLoginUser(); + MerInvoiceBo bo = new MerInvoiceBo(); + bo.setId(id); + bo.setCancelReason(remark); + bo.setCancelBy(loginUser.getNickname()); + return toAjax(merInvoiceService.reject(bo)); + } + + /** + * 服务商上传发票 + * @param bo + * @return + */ + @Log(title = "服务商上传发票", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/uploadInvoice") + public R uploadInvoice(@Validated(AddGroup.class) @RequestBody UploadInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceService.uploadInvoice(bo)); + } + + /** + * 服务商添加或修改发票申请快递 + * @param id 发票申请id + * @param iogisticsNo 快递单号 + * @param iogisticsCompany 快递公司 + * @return + */ + @Log(title = "服务商添加或修改发票申请快递", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editIogistics") + public R editIogistics(long id,@NotBlank(message = "快递单号不能为空") String iogisticsNo,@NotBlank(message = "快递公司不能为空") String iogisticsCompany) { + LoginUser loginUser = LoginHelper.getLoginUser(); + MerInvoiceBo bo = new MerInvoiceBo(); + bo.setId(id); + bo.setIogisticsNo(iogisticsNo); + bo.setIogisticsCompany(iogisticsCompany); + bo.setIogisticsBy(loginUser.getNickname()); + return toAjax(merInvoiceService.editIogistics(bo)); + } + + /** + * 商户签收发票快递 + * @param id 发票申请id + * @return + */ + @Log(title = "商户签收发票快递", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/receivingIogistics") + public R receivingIogistics(long id) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return toAjax(merInvoiceService.receivingIogistics(id,loginUser.getNickname())); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java new file mode 100644 index 0000000..71078f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.service.IMerInvoiceDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 开票明细 + * 前端访问路由地址为:/payment/invoiceDetail + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceDetail") +public class MerInvoiceDetailController extends BaseController { + + private final IMerInvoiceDetailService merInvoiceDetailService; + + /** + * 查询开票明细列表 + */ + //@SaCheckPermission("payment:invoiceDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceDetailBo bo, PageQuery pageQuery) { + return merInvoiceDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出开票明细列表 + */ + @SaCheckPermission("payment:invoiceDetail:export") + @Log(title = "开票明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceDetailBo bo, HttpServletResponse response) { + List list = merInvoiceDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "开票明细", MerInvoiceDetailVo.class, response); + } + + /** + * 获取开票明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceDetailService.queryById(id)); + } + + /** + * 新增开票明细 + */ + @SaCheckPermission("payment:invoiceDetail:add") + @Log(title = "开票明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceDetailBo bo) { + return toAjax(merInvoiceDetailService.insertByBo(bo)); + } + + /** + * 修改开票明细 + */ + //@SaCheckPermission("payment:invoiceDetail:edit") + @Log(title = "开票明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceDetailBo bo) { + return toAjax(merInvoiceDetailService.updateByBo(bo)); + } + + /** + * 删除开票明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceDetail:remove") + @Log(title = "开票明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java new file mode 100644 index 0000000..4bfd609 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java @@ -0,0 +1,148 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.payment.invoice.service.IMerInvoiceTypeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票类目 + * 前端访问路由地址为:/payment/invoiceType + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceType") +public class MerInvoiceTypeController extends BaseController { + + private final IMerInvoiceTypeService merInvoiceTypeService; + + /** + * 查询发票类目列表(分页) + */ + @SaCheckPermission("payment:invoiceType:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceTypeBo bo, PageQuery pageQuery) { + return merInvoiceTypeService.queryPageList(bo, pageQuery); + } + + /** + * 查询发票类目列表 + */ + @GetMapping("/getList") + public R> getList(MerInvoiceTypeBo bo) { + return R.ok(merInvoiceTypeService.queryList(bo)); + } + + + /** + * 查询发票类目列表 + */ + @GetMapping("/getListInvoice") + public R> getListInvoice(MerInvoiceTypeBo bo){ + return R.ok(this.merInvoiceTypeService.getListInvoice(bo)); + } + + + /** + * 查询发票类目列表 + */ + @GetMapping("/getListKpInvoice") + public R> getListInvoice(Integer proId){ + return R.ok(this.merInvoiceTypeService.kp(proId)); + } + + + /** + * 查询商户指定产品的开票类目 + * @param proId 产品id + * @param billIds 代发批次id(多个逗号分隔) + * @return + */ + @GetMapping("/types") + public R> types(int proId,String billIds) { + return R.ok(merInvoiceTypeService.selectList(11,billIds,proId)); + } + + /** + * 导出发票类目列表 + */ + @SaCheckPermission("payment:invoiceType:export") + @Log(title = "发票类目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceTypeBo bo, HttpServletResponse response) { + List list = merInvoiceTypeService.queryList(bo); + ExcelUtil.exportExcel(list, "发票类目", MerInvoiceTypeVo.class, response); + } + + /** + * 获取发票类目详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceType:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceTypeService.queryById(id)); + } + + /** + * 新增发票类目 + */ + @SaCheckPermission("payment:invoiceType:add") + @Log(title = "发票类目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceTypeBo bo) { + return toAjax(merInvoiceTypeService.insertByBo(bo)); + } + + /** + * 修改发票类目 + */ + @SaCheckPermission("payment:invoiceType:edit") + @Log(title = "发票类目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceTypeBo bo) { + return toAjax(merInvoiceTypeService.updateByBo(bo)); + } + + /** + * 删除发票类目 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceType:remove") + @Log(title = "发票类目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceTypeService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java new file mode 100644 index 0000000..bbfb186 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java @@ -0,0 +1,241 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户发票记录对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice") +public class MerInvoice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Long type; + + /** + * 纳税人识别号 + */ + private String creditCode; + + /** + * 开户银行地址 + */ + private String bankAddress; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开票类目 + */ + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + private Long addId; + + /** + * 收件人姓名 + */ + private String addName; + + /** + * 收件人手机号 + */ + private String addPhone; + + /** + * 收件地址 + */ + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + private String dwzcdz; + + /** + * 单位电话 + */ + private String dwdh; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + private String categoryOne; + + private String categoryTwo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java new file mode 100644 index 0000000..aaa114a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java @@ -0,0 +1,108 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 发票地址对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_address") +public class MerInvoiceAddress extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + private String name; + + /** + * 收件人手机号 + */ + private String phone; + + /** + * 收件地址 + */ + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + private String header; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 单位注册地址 + */ + private String unitAddress; + + /** + * 单位电话 + */ + private String unitPhone; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开户行地址 + */ + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java new file mode 100644 index 0000000..eac380c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java @@ -0,0 +1,121 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发票明细对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_bill") +public class MerInvoiceBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 票据id + */ + private Long invId; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单批次号 + */ + private String billNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java new file mode 100644 index 0000000..1c383f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java @@ -0,0 +1,73 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 开票明细对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_detail") +public class MerInvoiceDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + private String invNo; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 发票编号 + */ + private String detailNo; + + /** + * 发票样张地址 + */ + private String invPic; + + /** + * 开票类目 + */ + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java new file mode 100644 index 0000000..9c909fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java @@ -0,0 +1,46 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发票类目对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_type") +public class MerInvoiceType extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 任务类型 + */ + private String parentType; + + /** + * 开票类目 + */ + private String type; + + /** + * 排序 + */ + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java new file mode 100644 index 0000000..4d81e97 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java @@ -0,0 +1,116 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 发票地址业务对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceAddress.class, reverseConvertGenerate = false) +public class MerInvoiceAddressBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + @NotBlank(message = "收件人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 收件人手机号 + */ + @NotBlank(message = "收件人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 收件地址 + */ + @NotBlank(message = "收件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String header; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 单位注册地址 + */ + @NotBlank(message = "单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAddress; + + /** + * 单位电话 + */ + @NotBlank(message = "单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitPhone; + + /** + * 开户银行账号 + */ + @NotBlank(message = "开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户行地址 + */ + @NotBlank(message = "开户行地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java new file mode 100644 index 0000000..35ae4fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 发票明细业务对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceBill.class, reverseConvertGenerate = false) +public class MerInvoiceBillBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 票据id + */ + @NotNull(message = "票据id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invId; + + /** + * 开票金额(分) + */ + @NotNull(message = "开票金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + @NotNull(message = "账单金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 服务费金额(分) + */ + @NotNull(message = "服务费金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long serviceChargeAmount; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long taskId; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java new file mode 100644 index 0000000..8ecb797 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java @@ -0,0 +1,263 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户发票记录业务对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoice.class, reverseConvertGenerate = false) +public class MerInvoiceBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String creditCode; + + /** + * 开户银行地址 + */ + @NotBlank(message = "开户银行地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAddress; + + /** + * 开户银行账号 + */ + @NotBlank(message = "开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + @NotNull(message = "收件地址id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addId; + + /** + * 收件人姓名 + */ + @NotBlank(message = "收件人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addName; + + /** + * 收件人手机号 + */ + @NotBlank(message = "收件人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addPhone; + + /** + * 收件地址 + */ + @NotBlank(message = "收件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + @NotBlank(message = "单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dwzcdz; + + /** + * 单位电话 + */ + @NotBlank(message = "单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dwdh; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + /** + * 发票相关的代发批次列表 + */ + private List bills; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java new file mode 100644 index 0000000..a51b6d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java @@ -0,0 +1,77 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 开票明细业务对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceDetail.class, reverseConvertGenerate = false) +public class MerInvoiceDetailBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "开票明细id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + @NotBlank(message = "票据申请编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invNo; + + /** + * 开票金额(分) + */ + @NotNull(message = "开票金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invAmount; + + /** + * 发票编号 + */ + @NotBlank(message = "发票编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String detailNo; + + /** + * 发票样张地址 + */ + @NotBlank(message = "发票样张地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invPic; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java new file mode 100644 index 0000000..7a94c85 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java @@ -0,0 +1,48 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 发票类目业务对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceType.class, reverseConvertGenerate = false) +public class MerInvoiceTypeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 任务类型 + */ + @NotBlank(message = "任务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String parentType; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String type; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java new file mode 100644 index 0000000..3fedeb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java @@ -0,0 +1,43 @@ +package org.dromara.payment.invoice.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.invoice.domain.MerInvoice; + +import java.util.Date; +import java.util.List; + +/** + * 商户发票上传发票对象 + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UploadInvoiceBo extends BaseEntity { + + /** + * 发票申请id + */ + @NotNull(message = "发票申请id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 添加人 + */ + private String addBy; + + /** + * 开票明细列表 + */ + @NotEmpty(message = "开票明细列表不能为空", groups = { AddGroup.class, EditGroup.class }) + private List details; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java new file mode 100644 index 0000000..e3ecabf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票地址Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceAddressVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java new file mode 100644 index 0000000..b26c488 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceBillVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票明细Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java new file mode 100644 index 0000000..9ef1b6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 开票明细Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceDetailVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java new file mode 100644 index 0000000..07ae382 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票类目Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceTypeVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java new file mode 100644 index 0000000..6a5fa1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户发票记录Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java new file mode 100644 index 0000000..f614250 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java @@ -0,0 +1,131 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票地址视图对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceAddress.class) +public class MerInvoiceAddressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 收件人姓名 + */ + @ExcelProperty(value = "收件人姓名") + private String name; + + /** + * 收件人手机号 + */ + @ExcelProperty(value = "收件人手机号") + private String phone; + + /** + * 收件地址 + */ + @ExcelProperty(value = "收件地址") + private String address; + + /** + * 邮箱地址 + */ + @ExcelProperty(value = "邮箱地址") + private String email; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String header; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 单位注册地址 + */ + @ExcelProperty(value = "单位注册地址") + private String unitAddress; + + /** + * 单位电话 + */ + @ExcelProperty(value = "单位电话") + private String unitPhone; + + /** + * 开户银行账号 + */ + @ExcelProperty(value = "开户银行账号") + private String bankCard; + + /** + * 开户行地址 + */ + @ExcelProperty(value = "开户行地址") + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java new file mode 100644 index 0000000..e13f935 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java @@ -0,0 +1,179 @@ +package org.dromara.payment.invoice.domain.vo; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票明细视图对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceBill.class) +public class MerInvoiceBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 票据id + */ + @ExcelProperty(value = "票据id") + private Long invId; + + /** + * 开票金额(分) + */ + @ExcelProperty(value = "开票金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:取消") + private Long status; + + /** + * 账单金额(分) + */ + @ExcelProperty(value = "账单金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long money; + + /** + * 服务费金额(分) + */ + @ExcelProperty(value = "服务费金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long serviceChargeAmount; + + /** + * 项目id + */ + @ExcelProperty(value = "项目id") + private Long taskId; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + /** + * 账单批次状态(1:发放成功) + */ + @ExcelProperty(value = "账单状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:发放成功") + private Long billStatus = 1l; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java new file mode 100644 index 0000000..9f11744 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java @@ -0,0 +1,89 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 开票明细视图对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceDetail.class) +public class MerInvoiceDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 票据申请id + */ + @ExcelProperty(value = "票据申请id") + private Long invId; + + /** + * 票据申请编号 + */ + @ExcelProperty(value = "票据申请编号") + private String invNo; + + /** + * 开票金额(分) + */ + @ExcelProperty(value = "开票金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long invAmount; + + /** + * 发票编号 + */ + @ExcelProperty(value = "发票编号") + private String detailNo; + + /** + * 发票样张地址 + */ + @ExcelProperty(value = "发票样张地址") + private String invPic; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String category; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java new file mode 100644 index 0000000..9d580a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java @@ -0,0 +1,56 @@ +package org.dromara.payment.invoice.domain.vo; + +import org.dromara.payment.invoice.domain.MerInvoiceType; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票类目视图对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceType.class) +public class MerInvoiceTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 任务类型 + */ + @ExcelProperty(value = "任务类型") + private String parentType; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String type; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java new file mode 100644 index 0000000..dd3480f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java @@ -0,0 +1,313 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoice; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 商户发票记录视图对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoice.class) +public class MerInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 申请开票流水号 + */ + @ExcelProperty(value = "申请开票流水号") + private String no; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "发票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Long type; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String creditCode; + + /** + * 开户银行地址 + */ + @ExcelProperty(value = "开户银行地址") + private String bankAddress; + + /** + * 开户银行账号 + */ + @ExcelProperty(value = "开户银行账号") + private String bankCard; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String category; + + /** + * 发票数量(张) + */ + @ExcelProperty(value = "发票数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "张=") + private Long invNum; + + /** + * 开票总金额 + */ + @ExcelProperty(value = "开票总金额") + private Long invAmount; + + /** + * 收件地址id + */ + @ExcelProperty(value = "收件地址id") + private Long addId; + + /** + * 收件人姓名 + */ + @ExcelProperty(value = "收件人姓名") + private String addName; + + /** + * 收件人手机号 + */ + @ExcelProperty(value = "收件人手机号") + private String addPhone; + + /** + * 收件地址 + */ + @ExcelProperty(value = "收件地址") + private String addAddress; + + /** + * 邮箱地址 + */ + @ExcelProperty(value = "邮箱地址") + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + @ExcelProperty(value = "快递状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:未寄出,2=:未签收,3=:已签收") + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + @ExcelProperty(value = "快递时间") + private Date iogisticsTime; + + /** + * 快递发件人 + */ + @ExcelProperty(value = "快递发件人") + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + @ExcelProperty(value = "快递公司", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String iogisticsCompany; + + /** + * 快递单号 + */ + @ExcelProperty(value = "快递单号") + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + @ExcelProperty(value = "开票状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:待开票、2:已开票、3:已取消,4=:驳回,5=:开票中") + private Integer status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 取消时间 + */ + @ExcelProperty(value = "取消时间") + private Date cancelTime; + + /** + * 取消或驳回人 + */ + @ExcelProperty(value = "取消或驳回人") + private String cancelBy; + + /** + * 取消或驳回原因 + */ + @ExcelProperty(value = "取消或驳回原因") + private String cancelReason; + + /** + * 发票备注栏 + */ + @ExcelProperty(value = "发票备注栏") + private String invRemark; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 单位注册地址 + */ + @ExcelProperty(value = "单位注册地址") + private String dwzcdz; + + /** + * 单位电话 + */ + @ExcelProperty(value = "单位电话") + private String dwdh; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Integer busType; + + /** + * 快递签收时间 + */ + @ExcelProperty(value = "快递签收时间") + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + @ExcelProperty(value = "快递签收人") + private String iogisticsReceivingBy; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + /** + * 打款批次号(多个逗号分隔) + */ + private String billNos; + + private Date createTime; + + /** + * 发票列表 + */ + private List details; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java new file mode 100644 index 0000000..245e507 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.invoice.mapper; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 发票地址Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceAddressMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java new file mode 100644 index 0000000..a066b61 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java @@ -0,0 +1,58 @@ +package org.dromara.payment.invoice.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; + +import java.util.List; + +/** + * 发票明细Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceBillMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 修改代发批次开票状态 + * @param invId 发票申请id + * @param sourceStatus 源开票状态(0:待开票 1:已开票 2:已申请开票) + * @param targetStatus 新开票状态(0:待开票 1:已开票 2:已申请开票) + * @return + */ + Integer updateInvoiceStatus(@Param("invId") long invId,@Param("sourceStatus") int sourceStatus,@Param("targetStatus") int targetStatus); + + /** + * 查询发票中冻结的服务商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenSydFlows(@Param("invId") long invId); + + /** + * 查询发票中冻结的运营商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenOpFlows(@Param("invId") long invId); + + /** + * 查询发票中冻结的代理商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenChannelFlows(@Param("invId") long invId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java new file mode 100644 index 0000000..01d04da --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.invoice.mapper; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 开票明细Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceDetailMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java new file mode 100644 index 0000000..d7ecf44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.invoice.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户发票记录Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + MerInvoiceVo selectInvInfo(MerInvoiceBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java new file mode 100644 index 0000000..f4167c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.invoice.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 发票类目Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceTypeMapper extends BaseMapperPlus { + /** + * 根据产品id查询发票类目 + * @param busType 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param busId 业务id(多个逗号分隔) + * @param proId 产品id + * @param num 业务id数量 + * @return + */ + List selectInvoiceByProId(@Param("busType") int busType, @Param("busId") String busId, @Param("proId") int proId,@Param("num") int num); + + + List selectInvoiceListByProId(@Param("proId") int proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java new file mode 100644 index 0000000..01f7dd0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 发票地址Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceAddressService { + + /** + * 查询发票地址 + */ + MerInvoiceAddressVo queryById(Long id); + + /** + * 查询发票地址列表 + */ + TableDataInfo queryPageList(MerInvoiceAddressBo bo, PageQuery pageQuery); + + /** + * 查询发票地址列表 + */ + List queryList(MerInvoiceAddressBo bo); + + /** + * 新增发票地址 + */ + Boolean insertByBo(MerInvoiceAddressBo bo); + + /** + * 修改发票地址 + */ + Boolean updateByBo(MerInvoiceAddressBo bo); + + /** + * 校验并批量删除发票地址信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java new file mode 100644 index 0000000..0d4693d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 发票明细Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceBillService { + + /** + * 查询发票明细 + */ + MerInvoiceBillVo queryById(Long id); + + /** + * 查询发票明细列表 + */ + TableDataInfo queryPageList(MerInvoiceBillBo bo, PageQuery pageQuery); + + /** + * 查询发票明细列表 + */ + List queryList(MerInvoiceBillBo bo); + + /** + * 新增发票明细 + */ + Boolean insertByBo(MerInvoiceBillBo bo); + + /** + * 修改发票明细 + */ + Boolean updateByBo(MerInvoiceBillBo bo); + + /** + * 校验并批量删除发票明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java new file mode 100644 index 0000000..e8b7931 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 开票明细Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceDetailService { + + /** + * 查询开票明细 + */ + MerInvoiceDetailVo queryById(Long id); + + /** + * 查询开票明细列表 + */ + TableDataInfo queryPageList(MerInvoiceDetailBo bo, PageQuery pageQuery); + + /** + * 查询开票明细列表 + */ + List queryList(MerInvoiceDetailBo bo); + + /** + * 新增开票明细 + */ + Boolean insertByBo(MerInvoiceDetailBo bo); + + /** + * 修改开票明细 + */ + Boolean updateByBo(MerInvoiceDetailBo bo); + + /** + * 校验并批量删除开票明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java new file mode 100644 index 0000000..f43fd44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java @@ -0,0 +1,84 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商户发票记录Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceService { + + /** + * 查询商户发票记录 + */ + MerInvoiceVo queryById(Long id); + + /** + * 查询商户发票记录列表 + */ + TableDataInfo queryPageList(MerInvoiceBo bo, PageQuery pageQuery); + + /** + * 查询商户发票记录列表 + */ + List queryList(MerInvoiceBo bo); + + /** + * 新增商户发票记录 + */ + Boolean insertByBo(MerInvoiceBo bo); + + /** + * 修改商户发票记录 + */ + Boolean updateByBo(MerInvoiceBo bo); + + /** + * 校验并批量删除商户发票记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商驳回发票申请 + * @return + */ + Boolean reject(MerInvoiceBo bo); + + /** + * 服务商上传发票 + * @param bo + * @return + */ + Boolean uploadInvoice(UploadInvoiceBo bo); + + /** + * 服务商添加或修改发票申请快递 + * @return + */ + Boolean editIogistics(MerInvoiceBo bo); + + /** + * 商户签收发票快递 + * @param invId 发票申请id + * @param oper 操作人 + * @return + */ + Boolean receivingIogistics(long invId,String oper); + + + /*** + * 根据发票流水号查询发票详情 + * @param no + * @return + */ + public MerInvoiceVo queryByNo(String no); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java new file mode 100644 index 0000000..05dc242 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java @@ -0,0 +1,66 @@ +package org.dromara.payment.invoice.service; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 发票类目Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceTypeService { + + /** + * 查询发票类目 + */ + MerInvoiceTypeVo queryById(Long id); + + /** + * 查询发票类目列表 + */ + TableDataInfo queryPageList(MerInvoiceTypeBo bo, PageQuery pageQuery); + + /** + * 查询发票类目列表 + */ + List queryList(MerInvoiceTypeBo bo); + + /** + * 查询发票类目列表 + * @param busType 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param busId 业务id(多个逗号分隔) + * @param proId 产品id + * @return + */ + List selectList(int busType, String busId,int proId); + + /** + * 新增发票类目 + */ + Boolean insertByBo(MerInvoiceTypeBo bo); + + /** + * 修改发票类目 + */ + Boolean updateByBo(MerInvoiceTypeBo bo); + + /** + * 校验并批量删除发票类目信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List getListInvoice(MerInvoiceTypeBo bo); + + + public List kp(Integer proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java new file mode 100644 index 0000000..4f76da6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java @@ -0,0 +1,134 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSyd; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.invoice.service.IMerInvoiceAddressService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 发票地址Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceAddressServiceImpl implements IMerInvoiceAddressService { + + private final MerInvoiceAddressMapper baseMapper; + + /** + * 查询发票地址 + */ + @Override + public MerInvoiceAddressVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票地址列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceAddressBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票地址列表 + */ + @Override + public List queryList(MerInvoiceAddressBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceAddressBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), "address", bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getEmail()), "email", bo.getEmail()); + lqw.eq(bo.getIsDefault() != null, "is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getHeader()), "header", bo.getHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), "nsr_sbh", bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitAddress()), "unit_address", bo.getUnitAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitPhone()), "unit_phone", bo.getUnitPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getBankAddress()), "bank_address", bo.getBankAddress()); + return lqw; + } + + /** + * 新增发票地址 + */ + @Override + public Boolean insertByBo(MerInvoiceAddressBo bo) { + MerInvoiceAddress add = MapstructUtils.convert(bo, MerInvoiceAddress.class); + validEntityBeforeSave(add); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票地址 + */ + @Override + public Boolean updateByBo(MerInvoiceAddressBo bo) { + MerInvoiceAddress update = MapstructUtils.convert(bo, MerInvoiceAddress.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceAddress entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerInvoiceAddress::getMerId,entity.getMerId()); + MerInvoiceAddress exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || entity.getId() != exists.getId())){ + throw new ServiceException("发票地址已存在"); + } + } + + /** + * 批量删除发票地址 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java new file mode 100644 index 0000000..d1e87b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java @@ -0,0 +1,127 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.mapper.MerInvoiceBillMapper; +import org.dromara.payment.invoice.service.IMerInvoiceBillService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 发票明细Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceBillServiceImpl implements IMerInvoiceBillService { + + private final MerInvoiceBillMapper baseMapper; + + /** + * 查询发票明细 + */ + @Override + public MerInvoiceBillVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票明细列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceBillBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票明细列表 + */ + @Override + public List queryList(MerInvoiceBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceBillBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getInvId() != null, "t.inv_id", bo.getInvId()); + lqw.eq(bo.getInvAmount() != null, "t.inv_amount", bo.getInvAmount()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getServiceChargeAmount() != null, "t.service_charge_amount", bo.getServiceChargeAmount()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBillId() != null, "t.bill_id", bo.getBillId()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), "t.bill_no", bo.getBillNo()); + return lqw; + } + + /** + * 新增发票明细 + */ + @Override + public Boolean insertByBo(MerInvoiceBillBo bo) { + MerInvoiceBill add = MapstructUtils.convert(bo, MerInvoiceBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票明细 + */ + @Override + public Boolean updateByBo(MerInvoiceBillBo bo) { + MerInvoiceBill update = MapstructUtils.convert(bo, MerInvoiceBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceBill entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除发票明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java new file mode 100644 index 0000000..540ad8d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.invoice.service.IMerInvoiceDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 开票明细Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceDetailServiceImpl implements IMerInvoiceDetailService { + + private final MerInvoiceDetailMapper baseMapper; + + /** + * 查询开票明细 + */ + @Override + public MerInvoiceDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询开票明细列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询开票明细列表 + */ + @Override + public List queryList(MerInvoiceDetailBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getInvId() != null, "inv_id", bo.getInvId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvNo()), "inv_no", bo.getInvNo()); + lqw.eq(bo.getInvAmount() != null, "inv_amount", bo.getInvAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getDetailNo()), "detail_no", bo.getDetailNo()); + lqw.eq(StringUtils.isNotBlank(bo.getInvPic()), "inv_pic", bo.getInvPic()); + lqw.eq(StringUtils.isNotBlank(bo.getCategory()), "category", bo.getCategory()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + return lqw; + } + + /** + * 新增开票明细 + */ + @Override + public Boolean insertByBo(MerInvoiceDetailBo bo) { + MerInvoiceDetail add = MapstructUtils.convert(bo, MerInvoiceDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改开票明细 + */ + @Override + public Boolean updateByBo(MerInvoiceDetailBo bo) { + MerInvoiceDetail update = MapstructUtils.convert(bo, MerInvoiceDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除开票明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java new file mode 100644 index 0000000..ffd732b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java @@ -0,0 +1,463 @@ +package org.dromara.payment.invoice.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceBillMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.mapper.MerInvoiceMapper; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商户发票记录Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceServiceImpl implements IMerInvoiceService { + + private final MerInvoiceMapper baseMapper; + + private final MerInvoiceBillMapper invoiceBillMapper; + + private final MerBillMapper billMapper; + + private final MerInvoiceDetailMapper invoiceDetailMapper; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final ISysSydAccountService sydAccountService; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final IBusChannelAccountService channelAccountService; + + private final MerInvoiceAddressMapper merInvoiceAddressMapper; + + private final SysSydMapper sydMapper; + + private final IXyjService xyjService; + + private final BusMerchantMapper merchantMapper; + /** + * 查询商户发票记录 + */ + @Override + public MerInvoiceVo queryById(Long id){ + MerInvoiceBo invoiceBo = new MerInvoiceBo(); + invoiceBo.setId(id); + MerInvoiceVo rtn = this.baseMapper.selectInvInfo(invoiceBo); + if(rtn != null) { + rtn.setDetails(invoiceDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerInvoiceDetail::getInvId, id))); + } + return rtn; + } + + /** + * 查询商户发票记录 + */ + @Override + public MerInvoiceVo queryByNo(String no){ + MerInvoiceBo invoiceBo = new MerInvoiceBo(); + invoiceBo.setNo(no); + MerInvoiceVo rtn = this.baseMapper.selectInvInfo(invoiceBo); + if(rtn != null) { + rtn.setDetails(invoiceDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerInvoiceDetail::getInvId, rtn.getId()))); + } + return rtn; + } + + /** + * 查询商户发票记录列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户发票记录列表 + */ + @Override + public List queryList(MerInvoiceBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "t.no", bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getHeader()), "t.header", bo.getHeader()); + lqw.eq(bo.getType() != null, "t.type", bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getCreditCode()), "t.credit_code", bo.getCreditCode()); + lqw.eq(StringUtils.isNotBlank(bo.getBankAddress()), "t.bank_address", bo.getBankAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getCategory()), "t.category", bo.getCategory()); + lqw.eq(bo.getInvNum() != null, "t.inv_num", bo.getInvNum()); + lqw.eq(bo.getInvAmount() != null, "t.inv_amount", bo.getInvAmount()); + lqw.eq(bo.getAddId() != null, "t.add_id", bo.getAddId()); + lqw.like(StringUtils.isNotBlank(bo.getAddName()), "t.add_name", bo.getAddName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddPhone()), "t.add_phone", bo.getAddPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getAddAddress()), "t.add_address", bo.getAddAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getAddEmail()), "t.add_email", bo.getAddEmail()); + lqw.eq(bo.getIogisticsStatus() != null, "t.iogistics_status", bo.getIogisticsStatus()); + lqw.eq(bo.getIogisticsTime() != null, "t.iogistics_time", bo.getIogisticsTime()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsBy()), "t.iogistics_by", bo.getIogisticsBy()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsCompany()), "t.iogistics_company", bo.getIogisticsCompany()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsNo()), "t.iogistics_no", bo.getIogisticsNo()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(bo.getCancelTime() != null, "t.cancel_time", bo.getCancelTime()); + lqw.eq(StringUtils.isNotBlank(bo.getCancelBy()), "t.cancel_by", bo.getCancelBy()); + lqw.eq(StringUtils.isNotBlank(bo.getCancelReason()), "t.cancel_reason", bo.getCancelReason()); + lqw.eq(StringUtils.isNotBlank(bo.getInvRemark()), "t.inv_remark", bo.getInvRemark()); + lqw.eq(StringUtils.isNotBlank(bo.getDwzcdz()), "t.dwzcdz", bo.getDwzcdz()); + lqw.eq(StringUtils.isNotBlank(bo.getDwdh()), "t.dwdh", bo.getDwdh()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(bo.getIogisticsReceivingTime() != null, "t.iogistics_receiving_time", bo.getIogisticsReceivingTime()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsReceivingBy()), "t.iogistics_receiving_by", bo.getIogisticsReceivingBy()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + return lqw; + } + + /** + * 新增商户发票记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(MerInvoiceBo bo) { + MerInvoice add = MapstructUtils.convert(bo, MerInvoice.class); + validEntityBeforeSave(add); + add.setNo("T"+ DateUtils.dateTimeNow(DateUtils.YYYYMMDDHHMMSSSSS)+ RandomUtil.randomNumbers(5)); + add.setAddTime(new Date()); + add.setInvAmount(0l); + add.setStatus(5);//开票中 + List bills = new ArrayList<>(); + List billIds = new ArrayList<>(); + for (MerInvoiceBillBo bill:bo.getBills() + ) { + MerInvoiceBill b = MapstructUtils.convert(bill,MerInvoiceBill.class); + b.setSydId(add.getSydId()); + b.setSydNo(add.getSydNo()); + b.setOpId(add.getOpId()); + b.setOpNo(add.getOpNo()); + b.setChannelId(add.getChannelId()); + b.setChannelNo(add.getChannelNo()); + b.setChannelCode(add.getChannelCode()); + b.setMerId(add.getMerId()); + b.setMerNo(add.getMerNo()); + add.setInvAmount(add.getInvAmount()+b.getInvAmount()); + bills.add(b); + billIds.add(b.getBillId()); + } + //发起了申请 + if(billMapper.update(new LambdaUpdateWrapper().in(MerBill::getId,billIds) + .eq(MerBill::getIsInvoice,0) + .set(MerBill::getIsInvoice,2)) != billIds.size()){ + throw new ServiceException("不允许重复申请,申请失败"); + } + + this.merInvoiceAddressMapper.update(new LambdaUpdateWrapper().eq(MerInvoiceAddress::getMerId,add.getMerId()) + .set(MerInvoiceAddress::getName,add.getAddName()).set(MerInvoiceAddress::getPhone,add.getAddPhone()) + .set(MerInvoiceAddress::getAddress,add.getAddAddress())); + SysSyd sysSyd = sydMapper.selectSysSydById(add.getSydId()); + BusMerchant busMerchant = merchantMapper.selectById(add.getMerId()); + boolean flag; + + if(false){ + flag = xyjService.applyInvoice(busMerchant,sysSyd,add); + }else{ + flag = baseMapper.insert(add) > 0; + } + + if (flag) { + bills = bills.stream().peek(b -> b.setInvId(add.getId())).collect(Collectors.toList()); + invoiceBillMapper.insertBatch(bills); + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户发票记录 + */ + @Override + public Boolean updateByBo(MerInvoiceBo bo) { + MerInvoice update = MapstructUtils.convert(bo, MerInvoice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoice entity){ + //TODO 做一些数据校验,如唯一约束 + + } + + /** + * 批量删除商户发票记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reject(MerInvoiceBo bo) { + MerInvoice update = MapstructUtils.convert(bo, MerInvoice.class); + update.setCancelTime(new Date()); + update.setStatus(4);//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(MerInvoice::getId,bo.getId()) + .eq(MerInvoice::getStatus,5)) == 0){ + throw new ServiceException("不允许重复驳回,驳回失败"); + } + invoiceBillMapper.updateInvoiceStatus(bo.getId(),2,0); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean uploadInvoice(UploadInvoiceBo bo) { + MerInvoiceVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getStatus() != 5){ + throw new ServiceException("发票已上传,提交失败"); + } + List details = new ArrayList<>(); + long invAmount = 0;//开票金额(分) + for (MerInvoiceDetailBo d:bo.getDetails() + ) { + MerInvoiceDetail detail = MapstructUtils.convert(d,MerInvoiceDetail.class); + detail.setInvId(bo.getId()); + detail.setInvNo(vo.getNo()); + detail.setAddBy(bo.getAddBy()); + detail.setAddTime(new Date()); + invAmount += detail.getInvAmount(); + details.add(detail); + } + if(vo.getInvAmount() != invAmount){ + throw new ServiceException("发票申请金额与开票金额不一致,请核对后提交!"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(MerInvoice::getId,bo.getId()) + .eq(MerInvoice::getStatus,5) + .set(MerInvoice::getStatus,2) + .set(MerInvoice::getInvNum,details.size())) == 0){ + throw new ServiceException("重复操作,提交失败"); + } + invoiceDetailMapper.insertBatch(details); + invoiceBillMapper.updateInvoiceStatus(bo.getId(),2,1); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean editIogistics(MerInvoiceBo bo) { + MerInvoiceVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getStatus() != 2){ + throw new ServiceException("发票还未开出,提交失败"); + } + MerInvoice updater = MapstructUtils.convert(bo,MerInvoice.class); + if(vo.getIogisticsTime() == null){ + updater.setIogisticsTime(new Date()); + updater.setIogisticsStatus(2); + } + baseMapper.updateById(updater); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean receivingIogistics(long invId,String oper) { + MerInvoiceVo vo = baseMapper.selectVoById(invId); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getIogisticsStatus() != 2){ + throw new ServiceException("发票已签收或未到签收节点,提交失败"); + } + MerInvoice updater = new MerInvoice(); + updater.setId(invId); + updater.setIogisticsReceivingBy(oper); + updater.setIogisticsReceivingTime(new Date()); + updater.setIogisticsStatus(3); + if("系统".equals(oper)){ + updater.setRemark("自动签收发票"); + } + if(baseMapper.update(updater,new LambdaQueryWrapper().eq(MerInvoice::getId,invId) + .eq(MerInvoice::getIogisticsStatus,2)) == 0){ + throw new ServiceException("重复操作,签收失败"); + } + //解除冻结服务商的服务费 + List flows = invoiceBillMapper.selectFrozenSydFlows(invId); + if(flows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id_结算通道 + Map moneyMap = new HashMap<>(); + for (SysSydFlowsVo flow : + flows) { + SysSydFlows ssf = new SysSydFlows(0, flow.getSydId(), 7, flow.getChannel(), flow.getBusNo(), flow.getBankNo(), Math.abs(flow.getMoney()), new Date(), oper, "资金解冻", flow.getBillNo(), flow.getBillId(), null, "UF" + IdUtil.getSnowflakeNextIdStr(), 6, 2, flow.getPayerType(), flow.getPayerId(), flow.getPayerName(), flow.getPayerAcc(), flow.getPayerAccId(), null, null, null, null, null, "解冻成功", 0); + String key = ssf.getPayerAccId() + "_" + ssf.getChannel(); + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerAccId()); + acc.setFrozen(0l); + acc.setBankType(ssf.getChannel()); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (sydAccountService.updateFrozenByAccId(value.getAccId().intValue(), -value.getFrozen()) == 0) { + throw new ServiceException("服务商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + sydFlowsMapper.insertAll(newFlows); + } + //解除冻结运营商的服务费 + List opflows = invoiceBillMapper.selectFrozenOpFlows(invId); + if(opflows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id_结算通道 + Map moneyMap = new HashMap<>(); + for (BusOperatorFlowsVo flow : + opflows) { + BusOperatorFlows ssf = new BusOperatorFlows(0,flow.getOpId(),9,flow.getChannel(),null,null,Math.abs(flow.getMoney()),new Date(),flow.getAddBy(),"资金解冻",flow.getBillNo(),flow.getBillId(),flow.getBillDetailId(),"UF"+IdUtil.getSnowflakeNextIdStr(),6,2,flow.getPayeeType(),flow.getPayerId(),flow.getPayerName(),flow.getPayerAcc(),flow.getPayerAccId(),null,null,null,null,null,"解冻成功",0); + String key = ssf.getPayerAccId() + "_" + ssf.getChannel(); + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerAccId()); + acc.setFrozen(0l); + acc.setBankType(ssf.getChannel()); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (operatorAccountService.updateFrozenByAccId(value.getAccId().intValue(), -value.getFrozen()) == 0) { + throw new ServiceException("运营商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + operatorFlowsMapper.insertBatch(newFlows); + } + //解除冻结代理商的服务费 + List chflows = invoiceBillMapper.selectFrozenChannelFlows(invId); + if(chflows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id + Map moneyMap = new HashMap<>(); + for (BusChannelFlowsVo flow : + chflows) { + BusChannelFlows ssf = new BusChannelFlows(0,flow.getChannelId(),11,null,Math.abs(flow.getMoney()),new Date(),flow.getAddBy(),"资金解冻",flow.getBillNo(),flow.getBillId(),flow.getBillDetailId(),6, flow.getPayerType(), flow.getPayerId(),flow.getPayerName(),flow.getPayerAcc(),flow.getPayerAccId(),null, null,null,null,null,"解冻成功"); + String key = ssf.getPayerId()+""; + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerId()); + acc.setFrozen(0l); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (channelAccountService.updateFrozen(value.getAccId(), -value.getFrozen()) == 0) { + throw new ServiceException("代理商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + channelFlowsMapper.insertBatch(newFlows); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java new file mode 100644 index 0000000..5430c4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java @@ -0,0 +1,188 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.mapper.MerInvoiceTypeMapper; +import org.dromara.payment.invoice.service.IMerInvoiceTypeService; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 发票类目Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceTypeServiceImpl implements IMerInvoiceTypeService { + + private final MerInvoiceTypeMapper baseMapper; + + /** + * 查询发票类目 + */ + @Override + public MerInvoiceTypeVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票类目列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceTypeBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票类目列表 + */ + @Override + public List queryList(MerInvoiceTypeBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceTypeBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getParentType()), "parent_type", bo.getParentType()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), "type", bo.getType()); + lqw.eq(bo.getSort() != null, "sort", bo.getSort()); + return lqw; + } + + /** + * 新增发票类目 + */ + @Override + public Boolean insertByBo(MerInvoiceTypeBo bo) { + MerInvoiceType add = MapstructUtils.convert(bo, MerInvoiceType.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票类目 + */ + @Override + public Boolean updateByBo(MerInvoiceTypeBo bo) { + MerInvoiceType update = MapstructUtils.convert(bo, MerInvoiceType.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceType entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除发票类目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + public List kp(Integer proId){ + List list = this.baseMapper.selectInvoiceListByProId(proId); + + List resultMapList = new ArrayList<>(); + + list.stream().forEach(item->{ + boolean tag = true; + for(Map mp :resultMapList){ + if(item.getParentType().equals(mp.get("value"))){ + ((List)mp.get("children")).add(new HashMap<>(){ + { + put("value",item.getId()); + put("label",item.getType()); + } + }); + tag = false; + break; + } + } + + if(tag){ + resultMapList.add(new HashMap(){{ + put("value",item.getParentType()); + put("label",item.getParentType()); + put("children",new ArrayList<>()); + }}); + + } + }); + return resultMapList; + } + + + @Override + public List getListInvoice(MerInvoiceTypeBo bo) { + + List list = this.baseMapper.selectVoList(); + + List resultMapList = new ArrayList<>(); + + list.stream().forEach(item->{ + boolean tag = true; + for(Map mp :resultMapList){ + if(item.getParentType().equals(mp.get("value"))){ + ((List)mp.get("children")).add(new HashMap<>(){ + { + put("value",item.getId()); + put("label",item.getType()); + } + }); + tag = false; + break; + } + } + + if(tag){ + resultMapList.add(new HashMap(){{ + put("value",item.getParentType()); + put("label",item.getParentType()); + put("children",new ArrayList<>()); + }}); + + } + }); + return resultMapList; + } + + + + + @Override + public List selectList(int busType, String busId,int proId) { + return baseMapper.selectInvoiceByProId(busType,busId,proId,busId.split(",").length); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java new file mode 100644 index 0000000..1b11273 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java @@ -0,0 +1,173 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户资金账户 + * 前端访问路由地址为:/payment/merchantAccount + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAccount") +public class BusMerchantAccountController extends BaseController { + + private final IBusMerchantAccountService busMerchantAccountService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询商户资金账户列表 + */ + //@SaCheckPermission("payment:merchantAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId()); + TableDataInfo rtn = busMerchantAccountService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0){ + for (BusMerchantAccountVo vo:rtn.getRows() + ) { + Result rtnName = accountService.getAccountName(vo.getSydId(),vo.getBankType(),vo.getBankVirtualCard()); + vo.setAccName(rtnName.getRtnData()); + } + } + return rtn; + } + + @GetMapping("/listFp") + @Log(title = "结算账户分配查询", businessType = BusinessType.EXPORT) + public R getQueryList(BusMerchantAccountBo bo, PageQuery pageQuery){ + return R.ok(this.busMerchantAccountService.getMerAccountList(bo,pageQuery)); + } + + @PostMapping("/createXn") + @SaCheckPermission("payment:merchantAccount:createXn") + @Log(title = "创建运营商虚拟户", businessType = BusinessType.INSERT) + public R createXnAccount(Long sydId,Long merId,String merName,String bankType){ + return R.ok(this.busMerchantAccountService.createXnAccount(sydId,merId,merName,bankType)); + } + + + + + /** + * 查询商户资金账户的充值信息 + * @param id 资金账户id + * @return + */ + @GetMapping("/getRechargeAccount") + public R getRechargeAccount(int id) { + return R.ok(busMerchantAccountService.getRechargeAccount(id)); + } + + /** + * 查询商户资金账户列表 + * @param sydId 服务商id + * @return + */ + @GetMapping("/getAccounts") + public R> getAccounts(Long sydId) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(busMerchantAccountService.getAccByMerIdAndSydId(loginUser.getBusId(),sydId)); + } + + /** + * 查询商户默认资金账户 + * @return + */ + @GetMapping("/getDefaultAccount") + public R getDefaultAccount() { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(busMerchantAccountService.getDefaultAccByMerIdAndSydId(loginUser.getBusId(),loginUser.getSydId())); + } + + /** + * 导出商户资金账户列表 + */ + @SaCheckPermission("payment:merchantAccount:export") + @Log(title = "商户资金账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAccountBo bo, HttpServletResponse response) { + List list = busMerchantAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "商户资金账户", BusMerchantAccountVo.class, response); + } + + /** + * 获取商户资金账户详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:merchantAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAccountService.queryById(id)); + } + + /** + * 新增商户资金账户 + */ + @SaCheckPermission("payment:merchantAccount:add") + @Log(title = "商户资金账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAccountBo bo) { + return toAjax(busMerchantAccountService.insertByBo(bo)); + } + + /** + * 修改商户资金账户 + */ + @SaCheckPermission("payment:merchantAccount:edit") + @Log(title = "商户资金账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAccountBo bo) { + return toAjax(busMerchantAccountService.updateByBo(bo)); + } + + /** + * 删除商户资金账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAccount:remove") + @Log(title = "商户资金账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java new file mode 100644 index 0000000..03ac541 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.payment.merchant.service.IBusMerchantAccountSynService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户账户同步 + * 前端访问路由地址为:/payment/merchantAccountSyn + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAccountSyn") +public class BusMerchantAccountSynController extends BaseController { + + private final IBusMerchantAccountSynService busMerchantAccountSynService; + + /** + * 查询商户账户同步列表 + */ + @SaCheckPermission("payment:merchantAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAccountSynBo bo, PageQuery pageQuery) { + return busMerchantAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户账户同步列表 + */ + @SaCheckPermission("payment:merchantAccountSyn:export") + @Log(title = "商户账户同步", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAccountSynBo bo, HttpServletResponse response) { + List list = busMerchantAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "商户账户同步", BusMerchantAccountSynVo.class, response); + } + + /** + * 获取商户账户同步详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAccountSynService.queryById(id)); + } + + /** + * 新增商户账户同步 + */ + @SaCheckPermission("payment:merchantAccountSyn:add") + @Log(title = "商户账户同步", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAccountSynBo bo) { + return toAjax(busMerchantAccountSynService.insertByBo(bo)); + } + + /** + * 修改商户账户同步 + */ + @SaCheckPermission("payment:merchantAccountSyn:edit") + @Log(title = "商户账户同步", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAccountSynBo bo) { + return toAjax(busMerchantAccountSynService.updateByBo(bo)); + } + + /** + * 删除商户账户同步 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAccountSyn:remove") + @Log(title = "商户账户同步", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java new file mode 100644 index 0000000..dad306d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.payment.merchant.service.IBusMerchantAgreementService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户协议 + * 前端访问路由地址为:/payment/merchantAgreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAgreement") +public class BusMerchantAgreementController extends BaseController { + + private final IBusMerchantAgreementService busMerchantAgreementService; + + /** + * 查询商户协议列表 + */ + @SaCheckPermission("payment:merchantAgreement:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAgreementBo bo, PageQuery pageQuery) { + return busMerchantAgreementService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户协议列表 + */ + @SaCheckPermission("payment:merchantAgreement:export") + @Log(title = "商户协议", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAgreementBo bo, HttpServletResponse response) { + List list = busMerchantAgreementService.queryList(bo); + ExcelUtil.exportExcel(list, "商户协议", BusMerchantAgreementVo.class, response); + } + + /** + * 获取商户协议详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantAgreement:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAgreementService.queryById(id)); + } + + /** + * 新增商户协议 + */ + @SaCheckPermission("payment:merchantAgreement:add") + @Log(title = "商户协议", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAgreementBo bo) { + return toAjax(busMerchantAgreementService.insertByBo(bo)); + } + + /** + * 修改商户协议 + */ + @SaCheckPermission("payment:merchantAgreement:edit") + @Log(title = "商户协议", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAgreementBo bo) { + return toAjax(busMerchantAgreementService.updateByBo(bo)); + } + + /** + * 删除商户协议 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAgreement:remove") + @Log(title = "商户协议", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAgreementService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java new file mode 100644 index 0000000..adacb95 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java @@ -0,0 +1,126 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户提现记录 + * 前端访问路由地址为:/payment/merchantCashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantCashout") +public class BusMerchantCashoutController extends BaseController { + + private final IBusMerchantCashoutService busMerchantCashoutService; + + private final IBusMerchantAccountService merchantAccountService; + + /** + * 查询商户提现记录列表 + */ + @SaCheckPermission("payment:merchantCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantCashoutBo bo, PageQuery pageQuery) { + return busMerchantCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户提现记录列表 + */ + @SaCheckPermission("payment:merchantCashout:export") + @Log(title = "商户提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantCashoutBo bo, HttpServletResponse response) { + List list = busMerchantCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "商户提现记录", BusMerchantCashoutVo.class, response); + } + + /** + * 获取商户提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantCashoutService.queryById(id)); + } + + /** + * 获取商户提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(merchantAccountService.getCashoutAccount(id)); + } + + /** + * 新增商户提现记录 + */ + //@SaCheckPermission("payment:merchantCashout:add") + @Log(title = "商户提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busMerchantCashoutService.insertByBo(bo)); + } + + /** + * 修改商户提现记录 + */ + @SaCheckPermission("payment:merchantCashout:edit") + @Log(title = "商户提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantCashoutBo bo) { + return toAjax(busMerchantCashoutService.updateByBo(bo)); + } + + /** + * 删除商户提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantCashout:remove") + @Log(title = "商户提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java new file mode 100644 index 0000000..bb18769 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.payment.merchant.service.IBusMerchantConfigService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户配置 + * 前端访问路由地址为:/payment/merchantConfig + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantConfig") +public class BusMerchantConfigController extends BaseController { + + private final IBusMerchantConfigService busMerchantConfigService; + + /** + * 查询商户配置列表 + */ + @SaCheckPermission("payment:merchantConfig:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantConfigBo bo, PageQuery pageQuery) { + return busMerchantConfigService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户配置列表 + */ + @SaCheckPermission("payment:merchantConfig:export") + @Log(title = "商户配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantConfigBo bo, HttpServletResponse response) { + List list = busMerchantConfigService.queryList(bo); + ExcelUtil.exportExcel(list, "商户配置", BusMerchantConfigVo.class, response); + } + + /** + * 获取商户配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantConfig:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantConfigService.queryById(id)); + } + + /** + * 新增商户配置 + */ + @SaCheckPermission("payment:merchantConfig:add") + @Log(title = "商户配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantConfigBo bo) { + return toAjax(busMerchantConfigService.insertByBo(bo)); + } + + /** + * 修改商户配置 + */ + @SaCheckPermission("payment:merchantConfig:edit") + @Log(title = "商户配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantConfigBo bo) { + return toAjax(busMerchantConfigService.updateByBo(bo)); + } + + /** + * 删除商户配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantConfig:remove") + @Log(title = "商户配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantConfigService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java new file mode 100644 index 0000000..63d664b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java @@ -0,0 +1,246 @@ +package org.dromara.payment.merchant.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.json.JSONUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +/** + * 商户 + * 前端访问路由地址为:/payment/merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchant") +public class BusMerchantController extends BaseController { + + private final IBusMerchantService busMerchantService; + + private final ISysSydService sysSydService; + + /** + * 查询商户列表 + */ + @SaCheckPermission("payment:merchant:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantBo bo, PageQuery pageQuery) { + return busMerchantService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户列表 + */ + @SaCheckPermission("payment:merchant:export") + @Log(title = "商户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantBo bo, HttpServletResponse response) { + List list = busMerchantService.queryList(bo); + ExcelUtil.exportExcel(list, "商户", BusMerchantVo.class, response); + } + + /** + * 获取商户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantService.queryById(id)); + } + + /** + * 新增商户 + */ + @SaCheckPermission("payment:merchant:add") + @Log(title = "商户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantBo bo) { + return toAjax(busMerchantService.insertByBo(bo)); + } + + public static void main(String[] args) { + BusMerchantBo bo = new BusMerchantBo(); + bo.setName("企业名称"); + bo.setNameNc("企业简称"); + bo.setPassage("结算通道"); + bo.setNsrSbh("统一社会信用代码"); + bo.setFr("法人"); + bo.setFrSfz("法人身份证"); + bo.setFrSjh("法人手机号"); + bo.setWtr("经办人"); + bo.setWtrSfz("经办人身份证"); + bo.setWtrSjh("经办人手机号"); + bo.setWtrEmail("经办人身份证"); + bo.setUnitArea("区域编码"); + bo.setUnitAreaName("区域名称"); + bo.setAddress("实际经营地址"); + bo.setNo("123"); + bo.setYyzzBeginDate(new Date()); + bo.setYyzzEndDate(new Date()); + bo.setIndustryCode("行业编码"); + bo.setIndustry("行业名称"); + bo.setFrCardidBeginDate(new Date()); + bo.setFrCardidEndDate(new Date()); + bo.setJbrCardidBeginDate(new Date()); + bo.setJbrCardidEndDate(new Date()); + bo.setYwyId(1L); + bo.setKhm("账户名称"); + bo.setKhhCode("开户行code"); + bo.setKhh("开户行"); + bo.setKhd("开户支行"); + bo.setKhhNo("开户行行号/银联号"); + bo.setBankCard("银行账号"); + bo.setJbckzhbm("基本存款账户"); + bo.setInvoceHeader("发票抬头"); + bo.setInvoceCreditCode("发票纳税人识别号"); + bo.setInvoceBankName("发票开户银行"); + bo.setInvoceAddress("发票单位注册地址"); + bo.setInvoceBankCard("发票开户银行账号"); + bo.setInvoceDwdh("发票单位电话"); + bo.setYyzz("营业执照"); + bo.setFhxkzPic("开户许可证"); + bo.setFrSfzzm("法人身份证正面"); + bo.setFrSfzfm("法人身份证反面"); + bo.setJbrSfzzm("经办人身份证正面"); + bo.setJbrSfzfm("经办人身份证反面"); + bo.setMtqjzPic("门头照片"); + bo.setBgzp1Pic("办公照片1"); + bo.setBgzp2Pic("办公照片21"); + bo.setYwcjsm("业务场景说明"); + bo.setYwcjzsxcnh("业务场景真实性承诺函"); + bo.setFddsqxy("法大大授权协议"); + bo.setTshyxkz("特殊行业许可证"); + + System.out.println(JSONUtil.toJsonStr(bo)); + } + + /** + * 配置业务员 + */ + @SaCheckPermission("payment:merchant:setYwy") + @Log(title = "配置业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/setYwy") + public R setYwy(Long id,Long ywyId) { + return R.ok(busMerchantService.setYwy(id,ywyId)); + } + + + /** + * 解绑业务员 + */ + @SaCheckPermission("payment:merchant:unbindYwy") + @Log(title = "解绑业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/ubYwy") + public R unbindYwy(Long id,Long ywyId) { + return R.ok(busMerchantService.unbindYwy(id,ywyId)); + } + + + + + + + + /** + * 修改商户 + */ + @SaCheckPermission("payment:merchant:edit") + @Log(title = "商户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantBo bo) { + return toAjax(busMerchantService.updateByBo(bo)); + } + + /** + * 删除商户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchant:remove") + @Log(title = "商户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 根据用户名查询商户可用的服务商 + * @param userName 用户名 + * @return + */ + @PostMapping("/getSydByUserName") + public R> getSydByUserName(@NotEmpty(message = "用户名不能为空") String userName) { + return R.ok(sysSydService.getSydByUserName(userName)); + } + + /** + * 获取商户相关的服务商 + * @return + */ + @GetMapping("/getSyds") + public R> getSyds() { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(sysSydService.selectSydByMerId(loginUser.getBusId())); + } + + + /** + * 审核代理商 + */ + @SaCheckPermission("payment:merchant:check") + @Log(title = "审核商户", businessType = BusinessType.UPDATE) + @PostMapping("/chk") + public R chk(Long merId,Long checkType,String reason,String domain) { + return R.ok(this.busMerchantService.checkMerChant(merId,checkType,reason,domain)); + } + + + + /** + * 切换服务商 + * @param sydId 服务商id + * @return + */ + @GetMapping("/switchSyd") + public R switchSyd(long sydId) { + LoginUser loginUser = LoginHelper.getLoginUser(); + loginUser.setSydId(sydId); + LoginHelper.updateLoginUser(loginUser); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java new file mode 100644 index 0000000..117bb2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java @@ -0,0 +1,109 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户流水 + * 前端访问路由地址为:/payment/merchantFlows + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantFlows") +public class BusMerchantFlowsController extends BaseController { + + private final IBusMerchantFlowsService busMerchantFlowsService; + + /** + * 查询商户流水列表 + */ + //@SaCheckPermission("payment:merchantFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantFlowsBo bo, PageQuery pageQuery) { + return busMerchantFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户流水列表 + */ + //@SaCheckPermission("payment:merchantFlows:export") + @Log(title = "商户流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantFlowsBo bo, HttpServletResponse response) { + bo.setMerId(LoginHelper.getBusId()); + List list = busMerchantFlowsService.queryList(bo); + ExcelUtil.exportExcel(list, "商户流水", BusMerchantFlowsVo.class, response); + } + + /** + * 获取商户流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantFlowsService.queryById(id)); + } + + /** + * 新增商户流水 + */ + @SaCheckPermission("payment:merchantFlows:add") + @Log(title = "商户流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantFlowsBo bo) { + return toAjax(busMerchantFlowsService.insertByBo(bo)); + } + + /** + * 修改商户流水 + */ + @SaCheckPermission("payment:merchantFlows:edit") + @Log(title = "商户流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantFlowsBo bo) { + return toAjax(busMerchantFlowsService.updateByBo(bo)); + } + + /** + * 删除商户流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantFlows:remove") + @Log(title = "商户流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java new file mode 100644 index 0000000..b99faaf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java @@ -0,0 +1,115 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户产品表 + * 前端访问路由地址为:/payment/merchantProduct + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantProduct") +public class BusMerchantProductController extends BaseController { + + private final IBusMerchantProductService busMerchantProductService; + + /** + * 查询商户产品表列表 + */ +// @SaCheckPermission("payment:merchantProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantProductBo bo, PageQuery pageQuery) { + return busMerchantProductService.queryPageList(bo, pageQuery); + } + + @GetMapping("/queryList") + public R> queryList(BusMerchantProductBo bo) { + return R.ok(busMerchantProductService.queryList(bo)); + } + + /** + * 导出商户产品表列表 + */ + @SaCheckPermission("payment:merchantProduct:export") + @Log(title = "商户产品表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantProductBo bo, HttpServletResponse response) { + List list = busMerchantProductService.queryList(bo); + ExcelUtil.exportExcel(list, "商户产品表", BusMerchantProductVo.class, response); + } + + /** + * 获取商户产品表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantProductService.queryById(id)); + } + + /** + * 新增商户产品表 + */ +// @SaCheckPermission("payment:merchantProduct:add") + @Log(title = "商户产品表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody JSONObject boList) { + return toAjax(busMerchantProductService.insertByBo(boList)); + } + + /** + * 修改商户产品表 + */ + @SaCheckPermission("payment:merchantProduct:edit") + @Log(title = "商户产品表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantProductBo bo) { + return toAjax(busMerchantProductService.updateByBo(bo)); + } + + /** + * 删除商户产品表 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantProduct:remove") + @Log(title = "商户产品表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantProductService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java new file mode 100644 index 0000000..8088eda --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.payment.merchant.service.IBusMerchantProductSydService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 企业产品服务商 + * 前端访问路由地址为:/merchant/merchantProductSyd + * + * @author LionLi + * @date 2024-04-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantProductSyd") +public class BusMerchantProductSydController extends BaseController { + + private final IBusMerchantProductSydService busMerchantProductSydService; + + /** + * 查询企业产品服务商列表 + */ + @SaCheckPermission("merchant:merchantProductSyd:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantProductSydBo bo, PageQuery pageQuery) { + return busMerchantProductSydService.queryPageList(bo, pageQuery); + } + + /** + * 导出企业产品服务商列表 + */ + @SaCheckPermission("merchant:merchantProductSyd:export") + @Log(title = "企业产品服务商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantProductSydBo bo, HttpServletResponse response) { + List list = busMerchantProductSydService.queryList(bo); + ExcelUtil.exportExcel(list, "企业产品服务商", BusMerchantProductSydVo.class, response); + } + + /** + * 获取企业产品服务商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("merchant:merchantProductSyd:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantProductSydService.queryById(id)); + } + + /** + * 新增企业产品服务商 + */ +// @SaCheckPermission("merchant:merchantProductSyd:add") + @Log(title = "企业产品服务商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) BusMerchantProductSydBo bo) { + return toAjax(busMerchantProductSydService.insertByBo(bo)); + } + + /** + * 修改企业产品服务商 + */ + @SaCheckPermission("merchant:merchantProductSyd:edit") + @Log(title = "企业产品服务商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantProductSydBo bo) { + return toAjax(busMerchantProductSydService.updateByBo(bo)); + } + + /** + * 删除企业产品服务商 + * + * @param ids 主键串 + */ + @SaCheckPermission("merchant:merchantProductSyd:remove") + @Log(title = "企业产品服务商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantProductSydService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java new file mode 100644 index 0000000..cbc259e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.payment.merchant.service.IPubMerchantService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户申请表 + * 前端访问路由地址为:/payment/merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchant1") +public class PubMerchantController extends BaseController { + + private final IPubMerchantService pubMerchantService; + + /** + * 查询商户申请表列表 + */ + @SaCheckPermission("payment:merchant:list") + @GetMapping("/list") + public TableDataInfo list(PubMerchantBo bo, PageQuery pageQuery) { + return pubMerchantService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户申请表列表 + */ + @SaCheckPermission("payment:merchant:export") + @Log(title = "商户申请表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PubMerchantBo bo, HttpServletResponse response) { + List list = pubMerchantService.queryList(bo); + ExcelUtil.exportExcel(list, "商户申请表", PubMerchantVo.class, response); + } + + /** + * 获取商户申请表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(pubMerchantService.queryById(id)); + } + + /** + * 新增商户申请表 + */ + @SaCheckPermission("payment:merchant:add") + @Log(title = "商户申请表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody PubMerchantBo bo) { + return toAjax(pubMerchantService.insertByBo(bo)); + } + + /** + * 修改商户申请表 + */ + @SaCheckPermission("payment:merchant:edit") + @Log(title = "商户申请表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody PubMerchantBo bo) { + return toAjax(pubMerchantService.updateByBo(bo)); + } + + /** + * 删除商户申请表 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchant:remove") + @Log(title = "商户申请表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(pubMerchantService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java new file mode 100644 index 0000000..24b1d4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.payment.merchant.service.IVMerchantBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户账单汇总表 + * 前端访问路由地址为:/payment/merchantBill + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantBill") +public class VMerchantBillController extends BaseController { + + private final IVMerchantBillService vMerchantBillService; + + /** + * 查询商户账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBill:list") + @GetMapping("/list") + public TableDataInfo list(VMerchantBillBo bo, PageQuery pageQuery) { + return vMerchantBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBill:export") + @Log(title = "商户账单汇总表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(VMerchantBillBo bo, HttpServletResponse response) { + List list = vMerchantBillService.queryList(bo); + ExcelUtil.exportExcel(list, "商户账单汇总表", VMerchantBillVo.class, response); + } + + /** + * 获取商户账单汇总表详细信息 + * + * @param merId 主键 + */ + @SaCheckPermission("payment:merchantBill:query") + @GetMapping("/{merId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long merId) { + return R.ok(vMerchantBillService.queryById(merId)); + } + + /** + * 新增商户账单汇总表 + */ + @SaCheckPermission("payment:merchantBill:add") + @Log(title = "商户账单汇总表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody VMerchantBillBo bo) { + return toAjax(vMerchantBillService.insertByBo(bo)); + } + + /** + * 修改商户账单汇总表 + */ + @SaCheckPermission("payment:merchantBill:edit") + @Log(title = "商户账单汇总表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody VMerchantBillBo bo) { + return toAjax(vMerchantBillService.updateByBo(bo)); + } + + /** + * 删除商户账单汇总表 + * + * @param merIds 主键串 + */ + @SaCheckPermission("payment:merchantBill:remove") + @Log(title = "商户账单汇总表", businessType = BusinessType.DELETE) + @DeleteMapping("/{merIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] merIds) { + return toAjax(vMerchantBillService.deleteWithValidByIds(List.of(merIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java new file mode 100644 index 0000000..8968e7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.payment.merchant.service.IVMerchantBillDayService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户日账单汇总表 + * 前端访问路由地址为:/payment/merchantBillDay + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantBillDay") +public class VMerchantBillDayController extends BaseController { + + private final IVMerchantBillDayService vMerchantBillDayService; + + /** + * 查询商户日账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBillDay:list") + @GetMapping("/list") + public TableDataInfo list(VMerchantBillDayBo bo, PageQuery pageQuery) { + return vMerchantBillDayService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户日账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBillDay:export") + @Log(title = "商户日账单汇总表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(VMerchantBillDayBo bo, HttpServletResponse response) { + List list = vMerchantBillDayService.queryList(bo); + ExcelUtil.exportExcel(list, "商户日账单汇总表", VMerchantBillDayVo.class, response); + } + + /** + * 获取商户日账单汇总表详细信息 + * + * @param merId 主键 + */ + @SaCheckPermission("payment:merchantBillDay:query") + @GetMapping("/{merId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long merId) { + return R.ok(vMerchantBillDayService.queryById(merId)); + } + + /** + * 新增商户日账单汇总表 + */ + @SaCheckPermission("payment:merchantBillDay:add") + @Log(title = "商户日账单汇总表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody VMerchantBillDayBo bo) { + return toAjax(vMerchantBillDayService.insertByBo(bo)); + } + + /** + * 修改商户日账单汇总表 + */ + @SaCheckPermission("payment:merchantBillDay:edit") + @Log(title = "商户日账单汇总表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody VMerchantBillDayBo bo) { + return toAjax(vMerchantBillDayService.updateByBo(bo)); + } + + /** + * 删除商户日账单汇总表 + * + * @param merIds 主键串 + */ + @SaCheckPermission("payment:merchantBillDay:remove") + @Log(title = "商户日账单汇总表", businessType = BusinessType.DELETE) + @DeleteMapping("/{merIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] merIds) { + return toAjax(vMerchantBillDayService.deleteWithValidByIds(List.of(merIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java new file mode 100644 index 0000000..6bbf369 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java @@ -0,0 +1,384 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant") +public class BusMerchant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + @TableField(exist = false) + private Date addTime; + + /** + * 添加人 + */ + @TableField(exist = false) + private String addBy; + + /** + * 编辑人 + */ + @TableField(exist = false) + private String editer; + + /** + * 编辑时间 + */ + @TableField(exist = false) + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + private String jbrSfzfm; + + /** + * 门头全景照 + */ + private String mtqjzPic; + + /** + * 办公照片1 + */ + private String bgzp1Pic; + + /** + * 办公照片2 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 企业规模 + */ + private String scale; + + /** + * 企业logo地址 + */ + private String logo; + + /** + * 企业介绍 + */ + private String introduce; + + /** + * 业务员id + */ + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + private Integer isValiAcc; + + + private String agentNo; + + private String operatorNo; + + private String industryCode; + + private String khhCode; + + @TableField(exist = false) + private Long createDept; + + private Long createUnitId; + + private String createUnitNo; + + private String serviceTypeId; + + private String serviceTypeName; + + private String businessId; + + private String businessStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java new file mode 100644 index 0000000..b76e23a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java @@ -0,0 +1,147 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户资金账户对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_account") +public class BusMerchantAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public BusMerchantAccount(Long id,Long merId,Long sydId, Long accId,String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String name,String khh,String lhh) { + super(); + this.id = id; + this.merId = merId; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankVirtualCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + private String name; + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 可开票已结算金额 + */ + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + + //开户行 + private String khh; + + //联行号 + private String lhh; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java new file mode 100644 index 0000000..f8b290d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户账户同步对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_account_syn") +public class BusMerchantAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java new file mode 100644 index 0000000..7a4ee8a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java @@ -0,0 +1,96 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户协议对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_agreement") +public class BusMerchantAgreement extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java new file mode 100644 index 0000000..7ff7eb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java @@ -0,0 +1,123 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户提现记录对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_cashout") +public class BusMerchantCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java new file mode 100644 index 0000000..5e7fe9d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java @@ -0,0 +1,63 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户配置对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_config") +public class BusMerchantConfig extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantConfig(){} + + public BusMerchantConfig(Integer autoApprove, Integer valiWorker, Long minMoney, Long maxMoney, Long maxMoneyYear) { + this.autoApprove = autoApprove; + this.valiWorker = valiWorker; + this.minMoney = minMoney; + this.maxMoney = maxMoney; + this.maxMoneyYear = maxMoneyYear; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + private Integer valiWorker; + + private Long minMoney; + + private Long maxMoney; + + private Long maxMoneyYear; + + //不实名,不认证,不签约,0否, 1 是 + private Integer isNothing; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java new file mode 100644 index 0000000..769ab10 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java @@ -0,0 +1,231 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户流水对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_flows") +public class BusMerchantFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantFlows(){} + + public BusMerchantFlows(Integer direction,Long merId, Long sydId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType, String illustrate) { + this.direction = direction; + this.merId = merId; + this.sydId = sydId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + this.illustrate = illustrate; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + /** + * 说明 + */ + private String illustrate; + + /** + * 之前的金额 + */ + private transient Long preMoney; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java new file mode 100644 index 0000000..59c9f98 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java @@ -0,0 +1,154 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 商户产品表对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_product") +public class BusMerchantProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java new file mode 100644 index 0000000..f93131f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java @@ -0,0 +1,47 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业产品服务商对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_product_syd") +public class BusMerchantProductSyd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 企业ID + */ + private Long merId; + + /** + * 服务商ID + */ + private Long sydId; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java new file mode 100644 index 0000000..578ba32 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java @@ -0,0 +1,338 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户申请表对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("pub_merchant") +public class PubMerchant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人证件类型 + */ + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人证件号码 + */ + private String frSfz; + + /** + * 法人证件类型 + */ + private String frZjlx; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人证件有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人证件正面 + */ + private String frSfzzm; + + /** + * 法人证件反面 + */ + private String frSfzfm; + + /** + * 经办人证件正面 + */ + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + private String jbrSfzfm; + + /** + * 门牌照片 + */ + private String mtqjzPic; + + /** + * 前台照片 + */ + private String bgzp1Pic; + + /** + * 办公照片 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 流程确认函 + */ + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 主营业务 + */ + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java new file mode 100644 index 0000000..2488f7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java @@ -0,0 +1,101 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户账单汇总表对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("v_merchant_bill") +public class VMerchantBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @TableId(value = "mer_id") + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java new file mode 100644 index 0000000..0209973 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java @@ -0,0 +1,87 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户日账单汇总表对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("v_merchant_bill_day") +public class VMerchantBillDay extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 统计日期 + */ + private Date vDate; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java new file mode 100644 index 0000000..a9ebd23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java @@ -0,0 +1,125 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户资金账户业务对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAccount.class, reverseConvertGenerate = false) +public class BusMerchantAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行虚拟账号 + */ + @NotBlank(message = "银行虚拟账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankVirtualCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 已结算金额 + */ + @NotNull(message = "已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlement; + + /** + * 可开票已结算金额 + */ + @NotNull(message = "可开票已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + @NotNull(message = "已开票金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java new file mode 100644 index 0000000..3be91d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户账户同步业务对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAccountSyn.class, reverseConvertGenerate = false) +public class BusMerchantAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java new file mode 100644 index 0000000..ac1a8c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户协议业务对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAgreement.class, reverseConvertGenerate = false) +public class BusMerchantAgreementBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @NotNull(message = "协议类型(1:线上 2:线下)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStyle; + + /** + * 协议标题 + */ + @NotBlank(message = "协议标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 协议链接 + */ + @NotBlank(message = "协议链接不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrl; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java new file mode 100644 index 0000000..9d45eef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java @@ -0,0 +1,469 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 商户业务对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchant.class, reverseConvertGenerate = false) +public class BusMerchantBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + @NotBlank(message = "所属行业不能为空", groups = { AddGroup.class, EditGroup.class }) + private String industry; + + /** + * 商户名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 商户简称 + */ + @NotBlank(message = "企业简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameNc; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人身份证 + */ + @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 营业执照有效期开始日期 + */ +// @NotNull(message = "营业执照有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ +// @NotNull(message = "营业执照有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @NotBlank(message = "营业执照图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String yyzz; + + /** + * 支付密码 + */ +// @NotBlank(message = "支付密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payPassword; + + /** + * 密码输入错误次数 + */ +// @NotNull(message = "密码输入错误次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ +// @NotNull(message = "密码冻结结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ +// @NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 添加时间 + */ +// @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ +// @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ +// @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ +// @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 开户名 + */ + @NotBlank(message = "账户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户支行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户银行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 基本存款账户编号 + */ + @NotBlank(message = "基本存款账户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbckzhbm; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + @NotNull(message = "法人身份证有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + @NotNull(message = "法人身份证有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + @NotNull(message = "经办人身份证有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + @NotNull(message = "经办人身份证有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + /** + * 开户许可证 + */ + @NotBlank(message = "开户许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + @NotBlank(message = "经办人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + @NotBlank(message = "经办人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzfm; + + /** + * 门头全景照 + */ + @NotBlank(message = "门头全景照不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mtqjzPic; + + /** + * 办公照片1 + */ + @NotBlank(message = "办公照片1不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp1Pic; + + /** + * 办公照片2 + */ + @NotBlank(message = "办公照片2不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @NotBlank(message = "业务场景真实性承诺函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @NotBlank(message = "业务场景说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjsm; + + /** + * 法大大授权协议 + */ +// @NotBlank(message = "法大大授权协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fddsqxy; + + /** + * 特殊行业许可证 + */ +// @NotBlank(message = "特殊行业许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ +// @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ +// @NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 审核人 + */ +// @NotBlank(message = "审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 驳回原因 + */ +// @NotBlank(message = "驳回原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyReason; + + /** + * 企业规模 + */ +// @NotBlank(message = "企业规模不能为空", groups = { AddGroup.class, EditGroup.class }) + private String scale; + + /** + * 企业logo地址 + */ +// @NotBlank(message = "企业logo地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logo; + + /** + * 企业介绍 + */ +// @NotBlank(message = "企业介绍不能为空", groups = { AddGroup.class, EditGroup.class }) + private String introduce; + + /** + * 业务员id + */ +// @NotNull(message = "业务员id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ +// @NotNull(message = "是否验证资金账户(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isValiAcc; + + + private String agentNo; + + private String operatorNo; + + private String industryCode; + + private String khhCode; + + private Integer isProduct; + + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String scaleName; + + + private Long createUnitId; + + private String createUnitNo; + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java new file mode 100644 index 0000000..3413740 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户提现记录业务对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantCashout.class, reverseConvertGenerate = false) +public class BusMerchantCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + @NotNull(message = "商户账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java new file mode 100644 index 0000000..ae52bef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java @@ -0,0 +1,48 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户配置业务对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantConfig.class, reverseConvertGenerate = false) +public class BusMerchantConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + @NotNull(message = "是否自动审批(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + @NotNull(message = "是否验证用工签约(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer valiWorker; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java new file mode 100644 index 0000000..4560212 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java @@ -0,0 +1,218 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户流水业务对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantFlows.class, reverseConvertGenerate = false) +public class BusMerchantFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; + + /** + * 说明 + */ + @NotBlank(message = "说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String illustrate; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java new file mode 100644 index 0000000..095b505 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java @@ -0,0 +1,203 @@ +package org.dromara.payment.merchant.domain.bo; + +import cn.hutool.json.JSONUtil; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 商户产品表业务对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantProduct.class, reverseConvertGenerate = false) +public class BusMerchantProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商服务费率(%) + */ + @NotNull(message = "代理商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式", groups = { AddGroup.class, EditGroup.class }) + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ +// @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer proStatus; + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + + public static void main(String[] args) { + + Map map = new HashMap(); + map.put("merId",3); + map.put("merNo","A10109-B10534-M32085"); + map.put("busType",1); + + List list = new ArrayList(); + BusMerchantProductBo bo = new BusMerchantProductBo(); + + bo.setBusType(1L); + bo.setProNo("P1722211926"); + bo.setCostServiceCharge( new BigDecimal("1.00")); + bo.setServiceCharge( new BigDecimal("1.50")); + bo.setBusType(1L); + bo.setChargeMode(1); + bo.setInvoiceType(1); + bo.setMaxMonth(500000L); + bo.setProStatus(1); + bo.setSettlementStyle(1); + bo.setInvoiceItems("dsafdsa"); + + list.add(bo); + + map.put("boList",list); + + System.out.println(JSONUtil.toJsonStr(map)); + + + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java new file mode 100644 index 0000000..6acb11f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java @@ -0,0 +1,42 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 企业产品服务商业务对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantProductSyd.class, reverseConvertGenerate = false) +public class BusMerchantProductSydBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 企业ID + */ + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 服务商ID + */ + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java new file mode 100644 index 0000000..8d18a3b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java @@ -0,0 +1,398 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户申请表业务对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PubMerchant.class, reverseConvertGenerate = false) +public class PubMerchantBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + @NotBlank(message = "注册单号(示例:reg2024031916213007124782 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 所属行业(字典值) + */ + @NotBlank(message = "所属行业(字典值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String industry; + + /** + * 商户名称 + */ + @NotBlank(message = "商户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 商户简称 + */ + @NotBlank(message = "商户简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameNc; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人证件类型 + */ + @NotBlank(message = "经办人证件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + @NotBlank(message = "经办人证件号码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 法人证件号码 + */ + @NotBlank(message = "法人证件号码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人证件类型 + */ + @NotBlank(message = "法人证件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frZjlx; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 营业执照有效期开始日期 + */ + @NotNull(message = "营业执照有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @NotNull(message = "营业执照有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @NotBlank(message = "营业执照图片(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + @NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 基本存款账户编号 + */ + @NotBlank(message = "基本存款账户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbckzhbm; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 法人证件有效期开始日期 + */ + @NotNull(message = "法人证件有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + @NotNull(message = "法人证件有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + @NotNull(message = "经办人证件有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + @NotNull(message = "经办人证件有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @NotNull(message = "业务员id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ywyId; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + /** + * 开户许可证 + */ + @NotBlank(message = "开户许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fhxkzPic; + + /** + * 法人证件正面 + */ + @NotBlank(message = "法人证件正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人证件反面 + */ + @NotBlank(message = "法人证件反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 经办人证件正面 + */ + @NotBlank(message = "经办人证件正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + @NotBlank(message = "经办人证件反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzfm; + + /** + * 门牌照片 + */ + @NotBlank(message = "门牌照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mtqjzPic; + + /** + * 前台照片 + */ + @NotBlank(message = "前台照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp1Pic; + + /** + * 办公照片 + */ + @NotBlank(message = "办公照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @NotBlank(message = "业务场景真实性承诺函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @NotBlank(message = "业务场景说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @NotBlank(message = "法大大授权协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @NotBlank(message = "特殊行业许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tshyxkz; + + /** + * 流程确认函 + */ + @NotBlank(message = "流程确认函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ + @NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 审核人 + */ + @NotBlank(message = "审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 驳回原因 + */ + @NotBlank(message = "驳回原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyReason; + + /** + * 主营业务 + */ + @NotBlank(message = "主营业务不能为空", groups = { AddGroup.class, EditGroup.class }) + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java new file mode 100644 index 0000000..84065b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java @@ -0,0 +1,114 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户账单汇总表业务对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = VMerchantBill.class, reverseConvertGenerate = false) +public class VMerchantBillBo extends BaseEntity { + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @NotNull(message = "今日交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @NotNull(message = "今日交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + @NotNull(message = "本月交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + @NotNull(message = "本月交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + @NotNull(message = "本年交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + @NotNull(message = "本年交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java new file mode 100644 index 0000000..49d5286 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java @@ -0,0 +1,98 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户日账单汇总表业务对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = VMerchantBillDay.class, reverseConvertGenerate = false) +public class VMerchantBillDayBo extends BaseEntity { + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { EditGroup.class }) + private Long merId; + + /** + * 统计日期 + */ + @NotNull(message = "统计日期不能为空", groups = { EditGroup.class }) + private Date vDate; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @NotNull(message = "今日交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @NotNull(message = "今日交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java new file mode 100644 index 0000000..97221db --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户账户同步Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAccountSynVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java new file mode 100644 index 0000000..53cd8ca --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户资金账户Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java new file mode 100644 index 0000000..57dfd83 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户协议Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAgreementVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java new file mode 100644 index 0000000..3b04020 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户提现记录Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java new file mode 100644 index 0000000..60e9f05 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantConfigVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户配置Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantConfigVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java new file mode 100644 index 0000000..5fc5808 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户流水Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java new file mode 100644 index 0000000..fb3df99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantProductVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户产品表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java new file mode 100644 index 0000000..fdb3056 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java new file mode 100644 index 0000000..e359d0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemotePubMerchantVo; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户申请表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface PubMerchantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java new file mode 100644 index 0000000..7fae25c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteVMerchantBillDayVo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户日账单汇总表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface VMerchantBillDayVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java new file mode 100644 index 0000000..2de4bdc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteVMerchantBillVo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户账单汇总表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface VMerchantBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java new file mode 100644 index 0000000..198c589 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账户同步视图对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAccountSyn.class) +public class BusMerchantAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java new file mode 100644 index 0000000..4f3a98f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java @@ -0,0 +1,166 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户资金账户视图对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAccount.class) +public class BusMerchantAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + private String merName; + + private String sydName; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行虚拟账号 + */ + @ExcelProperty(value = "银行虚拟账号") + private String bankVirtualCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 已结算金额 + */ + @ExcelProperty(value = "已结算金额") + private Long settlement; + + /** + * 可开票已结算金额 + */ + @ExcelProperty(value = "可开票已结算金额") + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + + private String sydNo; + + private String merNo; + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java new file mode 100644 index 0000000..6e565bc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java @@ -0,0 +1,118 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户协议视图对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAgreement.class) +public class BusMerchantAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @ExcelProperty(value = "协议类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:线上,2=:线下") + private Integer signStyle; + + /** + * 协议标题 + */ + @ExcelProperty(value = "协议标题") + private String title; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:签约成功,2=:签约失败") + private Integer status; + + /** + * 协议链接 + */ + @ExcelProperty(value = "协议链接") + private String fileUrl; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java new file mode 100644 index 0000000..354b41c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java @@ -0,0 +1,151 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户提现记录视图对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantCashout.class) +public class BusMerchantCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户账户id + */ + @ExcelProperty(value = "商户账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java new file mode 100644 index 0000000..4f5349f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java @@ -0,0 +1,58 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户配置视图对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantConfig.class) +public class BusMerchantConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + @ExcelProperty(value = "是否自动审批", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + @ExcelProperty(value = "是否验证用工签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer valiWorker; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java new file mode 100644 index 0000000..73793bb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java @@ -0,0 +1,285 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户流水视图对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantFlows.class) +public class BusMerchantFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + + /** + * 商户id + */ + @ExcelIgnore + private Long merId; + + /** + * 结算中心id + */ + @ExcelIgnore + private Long sydId; + + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + + + + + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ +// @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelIgnore + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道") +// @ExcelDictFormat(readConverterExp = "招=行,交行,手动") + private String channel; + + + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + /** + * 交易金额(分) + */ + + @ExcelIgnore + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + + /** + * 余额(分) + */ +// @ExcelProperty(value = "余额(分)") + @ExcelIgnore + private Long balance; + + /** + * 交易人 + */ +// @ExcelProperty(value = "交易人") + @ExcelIgnore + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + + /** + * 账单id + */ +// @ExcelProperty(value = "账单id") + @ExcelIgnore + private Long billId; + + /** + * 账单明细id + */ +// @ExcelProperty(value = "账单明细id") + @ExcelIgnore + private Long billDetailId; + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ +// @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + @ExcelIgnore + private Integer payerType; + + /** + * 付款方id + */ +// @ExcelProperty(value = "付款方id") + @ExcelIgnore + private Long payerId; + + + /** + * 付款方账号id + */ +// @ExcelPropertyty(value = "付款方账号id") + @ExcelIgnore + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ +// @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + @ExcelIgnore + private Integer payeeType; + + /** + * 收款方id + */ +// @ExcelProperty(value = "收款方id") + @ExcelIgnore + private Long payeeId; + + + + /** + * 收款方账号id + */ +// @ExcelProperty(value = "收款方账号id") + @ExcelIgnore + private Long payeeAccId; + + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ +// @ExcelProperty(value = "回执单地址") + @ExcelIgnore + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ +// @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + @ExcelIgnore + private Integer payReceiptType; + + /** + * 说明 + */ +// @ExcelProperty(value = "说明") + @ExcelIgnore + private String illustrate; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java new file mode 100644 index 0000000..6551cb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 企业产品服务商视图对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantProductSyd.class) +public class BusMerchantProductSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 企业ID + */ + @ExcelProperty(value = "企业ID") + private Long merId; + + /** + * 服务商ID + */ + @ExcelProperty(value = "服务商ID") + private Long sydId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java new file mode 100644 index 0000000..fb74387 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java @@ -0,0 +1,195 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.math.BigDecimal; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户产品表视图对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantProduct.class) +public class BusMerchantProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + @ExcelProperty(value = "服务商名称") + private String serviceName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + private String createTime; + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商服务费率(%) + */ + @ExcelProperty(value = "代理商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + @ExcelProperty(value = "商户服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + + private String unId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java new file mode 100644 index 0000000..5c3f1a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java @@ -0,0 +1,39 @@ +package org.dromara.payment.merchant.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.settlement.api.domain.RechargeVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 商户充值账户视图对象 + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +public class BusMerchantRechargeVo extends RechargeVo { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户银行账号 + */ + private String merBankCard; + + /** + * 商户开户行 + */ + private String merKhh; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java new file mode 100644 index 0000000..29673a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java @@ -0,0 +1,477 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户视图对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchant.class) +public class BusMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String no; + + /** + * 所属行业(字典值) + */ + @ExcelProperty(value = "所属行业", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String industry; + + /** + * 商户名称 + */ + @ExcelProperty(value = "商户名称") + private String name; + + /** + * 商户简称 + */ + @ExcelProperty(value = "商户简称") + private String nameNc; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 营业执照有效期开始日期 + */ + @ExcelProperty(value = "营业执照有效期开始日期") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @ExcelProperty(value = "营业执照有效期结束日期") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @ExcelProperty(value = "营业执照图片", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "多=个逗号分隔") + private String yyzz; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 基本存款账户编号 + */ + @ExcelProperty(value = "基本存款账户编号") + private String jbckzhbm; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + @ExcelProperty(value = "法人身份证有效期开始日期") + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + @ExcelProperty(value = "法人身份证有效期结束日期") + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + @ExcelProperty(value = "经办人身份证有效期开始日期") + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + @ExcelProperty(value = "经办人身份证有效期结束日期") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long ywyId; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + + private Date createTime; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + /** + * 开户许可证 + */ + @ExcelProperty(value = "开户许可证") + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + @ExcelProperty(value = "经办人身份证正面") + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + @ExcelProperty(value = "经办人身份证反面") + private String jbrSfzfm; + + /** + * 门头全景照 + */ + @ExcelProperty(value = "门头全景照") + private String mtqjzPic; + + /** + * 办公照片1 + */ + @ExcelProperty(value = "办公照片1") + private String bgzp1Pic; + + /** + * 办公照片2 + */ + @ExcelProperty(value = "办公照片2") + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @ExcelProperty(value = "业务场景真实性承诺函") + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @ExcelProperty(value = "业务场景说明") + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @ExcelProperty(value = "法大大授权协议") + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @ExcelProperty(value = "特殊行业许可证") + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 企业规模 + */ + @ExcelProperty(value = "企业规模") + private String scale; + + /** + * 企业logo地址 + */ + @ExcelProperty(value = "企业logo地址") + private String logo; + + /** + * 企业介绍 + */ + @ExcelProperty(value = "企业介绍") + private String introduce; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + @ExcelProperty(value = "是否验证资金账户(0:否 1:是)") + private Integer isValiAcc; + + + + private String agentNo; + + private String operatorNo; + + private String agentName; + + private String operatorName; + + private String industryCode; + + private String khhCode; + + private String verifyStatusName; + + private String scaleName; + + private String scaleNo; + + private Long createUnitId; + + private String createUnitNo; + + private Integer isCanSetScale = 0; + + public String getVerifyStatusName() { + if(this.verifyStatus != null){ + if(this.verifyStatus.equals(0l)){ + return "待审核"; + }else if(this.verifyStatus.equals(1l)){ + return "驳回"; + }else if(this.verifyStatus.equals(2l)){ + return "审核通过"; + } + }else{ + return "--"; + } + return "--"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java new file mode 100644 index 0000000..46af21f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java @@ -0,0 +1,38 @@ +package org.dromara.payment.merchant.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusOperAndAgentAndMer + * @description + * @create 2024-04-28 17:59 + */ + + +@Data +public class BusOperAndAgentAndMer implements Serializable { + + + private Long sydId; + + private String sydNo; + + private Long opId; + + private String opNo; + + private Long channelId; + + private String channelNo; + + private String channelCode; + + private Long merId; + + private String merNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java new file mode 100644 index 0000000..51c3590 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java @@ -0,0 +1,410 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.PubMerchant; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户申请表视图对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PubMerchant.class) +public class PubMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + @ExcelProperty(value = "注册单号(示例:reg2024031916213007124782 )") + private String no; + + /** + * 所属行业(字典值) + */ + @ExcelProperty(value = "所属行业", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String industry; + + /** + * 商户名称 + */ + @ExcelProperty(value = "商户名称") + private String name; + + /** + * 商户简称 + */ + @ExcelProperty(value = "商户简称") + private String nameNc; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人证件类型 + */ + @ExcelProperty(value = "经办人证件类型") + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + @ExcelProperty(value = "经办人证件号码") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 法人证件号码 + */ + @ExcelProperty(value = "法人证件号码") + private String frSfz; + + /** + * 法人证件类型 + */ + @ExcelProperty(value = "法人证件类型") + private String frZjlx; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 营业执照有效期开始日期 + */ + @ExcelProperty(value = "营业执照有效期开始日期") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @ExcelProperty(value = "营业执照有效期结束日期") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @ExcelProperty(value = "营业执照图片", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "多=个逗号分隔") + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 基本存款账户编号 + */ + @ExcelProperty(value = "基本存款账户编号") + private String jbckzhbm; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 法人证件有效期开始日期 + */ + @ExcelProperty(value = "法人证件有效期开始日期") + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + @ExcelProperty(value = "法人证件有效期结束日期") + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + @ExcelProperty(value = "经办人证件有效期开始日期") + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + @ExcelProperty(value = "经办人证件有效期结束日期") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long ywyId; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + /** + * 开户许可证 + */ + @ExcelProperty(value = "开户许可证") + private String fhxkzPic; + + /** + * 法人证件正面 + */ + @ExcelProperty(value = "法人证件正面") + private String frSfzzm; + + /** + * 法人证件反面 + */ + @ExcelProperty(value = "法人证件反面") + private String frSfzfm; + + /** + * 经办人证件正面 + */ + @ExcelProperty(value = "经办人证件正面") + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + @ExcelProperty(value = "经办人证件反面") + private String jbrSfzfm; + + /** + * 门牌照片 + */ + @ExcelProperty(value = "门牌照片") + private String mtqjzPic; + + /** + * 前台照片 + */ + @ExcelProperty(value = "前台照片") + private String bgzp1Pic; + + /** + * 办公照片 + */ + @ExcelProperty(value = "办公照片") + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @ExcelProperty(value = "业务场景真实性承诺函") + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @ExcelProperty(value = "业务场景说明") + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @ExcelProperty(value = "法大大授权协议") + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @ExcelProperty(value = "特殊行业许可证") + private String tshyxkz; + + /** + * 流程确认函 + */ + @ExcelProperty(value = "流程确认函") + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 主营业务 + */ + @ExcelProperty(value = "主营业务") + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java new file mode 100644 index 0000000..66cf255 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户日账单汇总表视图对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = VMerchantBillDay.class) +public class VMerchantBillDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 统计日期 + */ + @ExcelProperty(value = "统计日期") + private Date vDate; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @ExcelProperty(value = "今日交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @ExcelProperty(value = "今日交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java new file mode 100644 index 0000000..2703a77 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账单汇总表视图对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = VMerchantBill.class) +public class VMerchantBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @ExcelProperty(value = "今日交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @ExcelProperty(value = "今日交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + @ExcelProperty(value = "本月交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + @ExcelProperty(value = "本月交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + @ExcelProperty(value = "本年交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + @ExcelProperty(value = "本年交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java new file mode 100644 index 0000000..d45ca24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.payment.merchant.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.payment.api.merchant.RemoteMerchantService; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.api.syd.RemoteSydService; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商户服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMerchantServiceImpl implements RemoteMerchantService { + private final IBusMerchantAccountService merchantAccountService; + + @Override + public RemoteBusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId, Long sydId) { + BusMerchantAccountVo accountVo = merchantAccountService.getDefaultAccByMerIdAndSydId(merId,sydId); + return accountVo != null ? MapstructUtils.convert(accountVo, RemoteBusMerchantAccountVo.class) : null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java new file mode 100644 index 0000000..724ca91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java @@ -0,0 +1,189 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; + +import java.util.List; + +/** + * 商户资金账户Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAccountMapper extends BaseMapperPlus { + /** + * 获取商户的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + public List getAccByMerIdAndSydId(@Param("merId") Long merId,@Param("sydId") Long sydId); + + /** + * 查询结算中心下商户默认的资金账户 + * @author 张涛 + * @date 2021年8月25日 + * @param sydId 结算中心id + * @param merId 商户id + * @return + */ + public List selectByMerIdAndSydId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 查询资金账户 + * @author 张涛 + * @date 2021年9月9日 + * @param accId 银行账户id + * @return + */ + public BusMerchantAccountVo selectByAccId(@Param("accId") int accId); + + /** + * 新增虚拟银行账号 + * @return 结果 + */ + public int insertAccount(BusMerchantAccount account); + + /** + * 修改商户开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param merId 商户id + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmount(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("invoice") long invoice,@Param("bankType") String bankType); + + /** + * 修改商户可开票已结算金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param merId 商户id + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceSettlement(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("invoice") long invoice,@Param("bankType") String bankType); + + /** + * 根据银行账户id更新 + * @author 张涛 + * @date 2021年9月6日 + * @param record + * @return + */ + public Integer updateByAccId(BusMerchantAccount record); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer lockByMerId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 银行账户解锁 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer unlockByMerId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlement(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 修改商户开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmountByAccId(@Param("accId") int accId,@Param("invoice") long invoice); + + /** + * 修改商户可开票已结算金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceSettlementByAccId(@Param("accId") int accId,@Param("invoice") long invoice); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlementByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + + + public List selectMerAccountLists(@Param("bo") BusMerchantAccountBo bo, @Param("page") Page page); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java new file mode 100644 index 0000000..9613bb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java @@ -0,0 +1,71 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户账户同步Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAccountSynMapper extends BaseMapperPlus { + /** + * 补全不存在同步记录的账户 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer autoNotExist(); + + /** + * 分配账户的同步批次 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @return + */ + public Integer allotSyns(@Param("synBatch") String synBatch,@Param("minId") int minId,@Param("start") int start,@Param("size") int size); + + /** + * 取消账户同步 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer cancelSyn(@Param("id") int id); + + /** + * 取消指定批次所有账户同步 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次 + * @return + */ + public Integer cancelSynByBatch(@Param("synBatch") String synBatch); + + /** + * 查询待同步的账户id + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @param size 数量 + * @return + */ + public List selectSyn(@Param("synBatch") String synBatch, @Param("size") Integer size); + + /** + * 账户加同步锁 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @param id 账户id + * @return + */ + public Integer lock(@Param("synBatch") String synBatch, @Param("id") int id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java new file mode 100644 index 0000000..b3d0b35 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户协议Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAgreementMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java new file mode 100644 index 0000000..aff83a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户提现记录Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantCashoutMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java new file mode 100644 index 0000000..b410a79 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java @@ -0,0 +1,17 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户配置Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantConfigMapper extends BaseMapperPlus { + + BusMerchantConfig selectByMerId(@Param("merId") Long merId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java new file mode 100644 index 0000000..3dbaec9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户流水Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantFlowsMapper extends BaseMapperPlus { + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java new file mode 100644 index 0000000..c0fb01a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java @@ -0,0 +1,54 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; + +import java.util.List; + +/** + * 商户Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantMapper extends BaseMapperPlus { + + + int setAndUnbindYwy(BusMerchant vo); + + + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + Page selectMerchantList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 查询企业列表 + * @param wrapper + * @return + */ + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + List selectMerchantListByRole(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据企业信息查询对应的渠道商,运营商 + * @param busMerchantBo + * @return + */ + BusOperAndAgentAndMer selOpAndAgentInfosByMerInfo(BusMerchantBo busMerchantBo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java new file mode 100644 index 0000000..a752c54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java @@ -0,0 +1,68 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.List; + +/** + * 商户产品表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantProductMapper extends BaseMapperPlus { + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:40 + * 说明:代理商 - 企业产品配置查询 + **/ + Page selBusMerProByTypeList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据商户,服务商查询产品信息 + * @param wrapper + * @return + */ + List selBusMerProList(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 18:16 + * 说明:根据产品编码,代理商编码,业务类型,查询最小的代理商服务费率 + **/ + + BigDecimal selMinChargeByAgentAndBusType(Map map); + + + int updateMerProInfos(BusMerchantProductBo bo); + + + /*** + * + * @return + */ + int updateMerProInfosService(); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java new file mode 100644 index 0000000..9643af7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 企业产品服务商Mapper接口 + * + * @author LionLi + * @date 2024-04-25 + */ +public interface BusMerchantProductSydMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java new file mode 100644 index 0000000..d9f7d99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户申请表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface PubMerchantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java new file mode 100644 index 0000000..d6c2324 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户日账单汇总表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface VMerchantBillDayMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java new file mode 100644 index 0000000..fe00528 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户账单汇总表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface VMerchantBillMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java new file mode 100644 index 0000000..9f1f8bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java @@ -0,0 +1,146 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.common.core.domain.R; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商户资金账户Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAccountService { + + /** + * 查询商户资金账户 + */ + BusMerchantAccountVo queryById(Long id); + + /** + * 查询商户资金账户列表 + */ + TableDataInfo queryPageList(BusMerchantAccountBo bo, PageQuery pageQuery); + + /** + * 查询商户资金账户列表 + */ + List queryList(BusMerchantAccountBo bo); + + /** + * 新增商户资金账户 + */ + Boolean insertByBo(BusMerchantAccountBo bo); + + /** + * 修改商户资金账户 + */ + Boolean updateByBo(BusMerchantAccountBo bo); + + /** + * 校验并批量删除商户资金账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取商户的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + List getAccByMerIdAndSydId(Long merId, Long sydId); + + /** + * 获取商户默认的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + + BusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId,Long sydId); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(Long sydId,long unitId,long amount,String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(Long sydId,long unitId,long amount,String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询商户资金账户的充值信息 + * @param id 资金账户id + * @return + */ + public BusMerchantRechargeVo getRechargeAccount(int id); + + /** + * 查询服务商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusMerchantAccountVo getCashoutAccount(Long id); + + + /*** + * 获取企业结算账户列表 + * @param bo + * @param pageQuery + * @return + */ + public List getMerAccountList(BusMerchantAccountBo bo, PageQuery pageQuery); + + + + /*** + * 创建企业虚拟户 + * @param sydId + * @param merId + * @param merName + * @param bankType + * @return + */ + Boolean createXnAccount(Long sydId, Long merId, String merName, String bankType); + + + public Boolean createThirdXnAccount(Long sydId, Long merId, String merName, String bankType,String bankCard,String accName); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java new file mode 100644 index 0000000..bb0ceef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户账户同步Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAccountSynService { + + /** + * 查询商户账户同步 + */ + BusMerchantAccountSynVo queryById(Long id); + + /** + * 查询商户账户同步列表 + */ + TableDataInfo queryPageList(BusMerchantAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询商户账户同步列表 + */ + List queryList(BusMerchantAccountSynBo bo); + + /** + * 新增商户账户同步 + */ + Boolean insertByBo(BusMerchantAccountSynBo bo); + + /** + * 修改商户账户同步 + */ + Boolean updateByBo(BusMerchantAccountSynBo bo); + + /** + * 校验并批量删除商户账户同步信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java new file mode 100644 index 0000000..3bcb031 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户协议Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAgreementService { + + /** + * 查询商户协议 + */ + BusMerchantAgreementVo queryById(Long id); + + /** + * 查询商户协议列表 + */ + TableDataInfo queryPageList(BusMerchantAgreementBo bo, PageQuery pageQuery); + + /** + * 查询商户协议列表 + */ + List queryList(BusMerchantAgreementBo bo); + + /** + * 新增商户协议 + */ + Boolean insertByBo(BusMerchantAgreementBo bo); + + /** + * 修改商户协议 + */ + Boolean updateByBo(BusMerchantAgreementBo bo); + + /** + * 校验并批量删除商户协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java new file mode 100644 index 0000000..2acb41b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java @@ -0,0 +1,60 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 商户提现记录Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantCashoutService { + + /** + * 查询商户提现记录 + */ + BusMerchantCashoutVo queryById(Long id); + + /** + * 查询商户提现记录列表 + */ + TableDataInfo queryPageList(BusMerchantCashoutBo bo, PageQuery pageQuery); + + /** + * 查询商户提现记录列表 + */ + List queryList(BusMerchantCashoutBo bo); + + /** + * 新增商户提现记录 + */ + Boolean insertByBo(BusMerchantCashoutBo bo); + + /** + * 修改商户提现记录 + */ + Boolean updateByBo(BusMerchantCashoutBo bo); + + /** + * 校验并批量删除商户提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java new file mode 100644 index 0000000..a18e8dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户配置Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantConfigService { + + /** + * 查询商户配置 + */ + BusMerchantConfigVo queryById(Long id); + + /** + * 查询商户配置列表 + */ + TableDataInfo queryPageList(BusMerchantConfigBo bo, PageQuery pageQuery); + + /** + * 查询商户配置列表 + */ + List queryList(BusMerchantConfigBo bo); + + /** + * 新增商户配置 + */ + Boolean insertByBo(BusMerchantConfigBo bo); + + /** + * 修改商户配置 + */ + Boolean updateByBo(BusMerchantConfigBo bo); + + /** + * 校验并批量删除商户配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java new file mode 100644 index 0000000..e8330f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java @@ -0,0 +1,53 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.AccountSyn; + +import java.util.Collection; +import java.util.List; + +/** + * 商户流水Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantFlowsService { + + /** + * 查询商户流水 + */ + BusMerchantFlowsVo queryById(Long id); + + /** + * 查询商户流水列表 + */ + TableDataInfo queryPageList(BusMerchantFlowsBo bo, PageQuery pageQuery); + + /** + * 查询商户流水列表 + */ + List queryList(BusMerchantFlowsBo bo); + + /** + * 新增商户流水 + */ + Boolean insertByBo(BusMerchantFlowsBo bo); + + /** + * 修改商户流水 + */ + Boolean updateByBo(BusMerchantFlowsBo bo); + + /** + * 校验并批量删除商户流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Long saveFlows(BusMerchantAccountVo acc, AccountSyn syn); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java new file mode 100644 index 0000000..a960f27 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java @@ -0,0 +1,51 @@ +package org.dromara.payment.merchant.service; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 商户产品表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantProductService { + + /** + * 查询商户产品表 + */ + BusMerchantProductVo queryById(Long id); + + /** + * 查询商户产品表列表 + */ + TableDataInfo queryPageList(BusMerchantProductBo bo, PageQuery pageQuery); + + /** + * 查询商户产品表列表 + */ + List queryList(BusMerchantProductBo bo); + + /** + * 新增商户产品表 + */ + Boolean insertByBo(JSONObject bo); + + /** + * 修改商户产品表 + */ + Boolean updateByBo(BusMerchantProductBo bo); + + /** + * 校验并批量删除商户产品表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java new file mode 100644 index 0000000..ef27ad2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 企业产品服务商Service接口 + * + * @author LionLi + * @date 2024-04-25 + */ +public interface IBusMerchantProductSydService { + + /** + * 查询企业产品服务商 + */ + BusMerchantProductSydVo queryById(Long id); + + /** + * 查询企业产品服务商列表 + */ + TableDataInfo queryPageList(BusMerchantProductSydBo bo, PageQuery pageQuery); + + /** + * 查询企业产品服务商列表 + */ + List queryList(BusMerchantProductSydBo bo); + + /** + * 新增企业产品服务商 + */ + Boolean insertByBo(BusMerchantProductSydBo bo); + + /** + * 修改企业产品服务商 + */ + Boolean updateByBo(BusMerchantProductSydBo bo); + + /** + * 校验并批量删除企业产品服务商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java new file mode 100644 index 0000000..793d7fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java @@ -0,0 +1,79 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantService { + + /** + * 查询商户 + */ + BusMerchantVo queryById(Long id); + + /** + * 查询商户列表 + */ + TableDataInfo queryPageList(BusMerchantBo bo, PageQuery pageQuery); + + /** + * 查询商户列表 + */ + List queryList(BusMerchantBo bo); + + /** + * 新增商户 + */ + Boolean insertByBo(BusMerchantBo bo); + + /** + * 修改商户 + */ + Boolean updateByBo(BusMerchantBo bo); + + /** + * 校验并批量删除商户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * @Param id:企业id,ywyId:业务员id + * @Return + * @Author sunzexing + * @Date 2024-04-20 16:01 + * 说明:设置业务员 + **/ + int setYwy(Long id, Long ywyId); + + + /** + * @Param id:企业id,ywyId:业务员id + * @Return + * @Author sunzexing + * @Date 2024-04-20 16:04 + * 说明:解绑业务员 + **/ + + Integer unbindYwy(Long id, Long ywyId); + + /*** + * 商户审核 + * @param merId + * @param checkType + * @param reason + * @param domain + * @return + */ + Boolean checkMerChant(Long merId, Long checkType, String reason, String domain); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java new file mode 100644 index 0000000..d705adf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户申请表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IPubMerchantService { + + /** + * 查询商户申请表 + */ + PubMerchantVo queryById(Long id); + + /** + * 查询商户申请表列表 + */ + TableDataInfo queryPageList(PubMerchantBo bo, PageQuery pageQuery); + + /** + * 查询商户申请表列表 + */ + List queryList(PubMerchantBo bo); + + /** + * 新增商户申请表 + */ + Boolean insertByBo(PubMerchantBo bo); + + /** + * 修改商户申请表 + */ + Boolean updateByBo(PubMerchantBo bo); + + /** + * 校验并批量删除商户申请表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java new file mode 100644 index 0000000..d13bb28 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户日账单汇总表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IVMerchantBillDayService { + + /** + * 查询商户日账单汇总表 + */ + VMerchantBillDayVo queryById(Long merId); + + /** + * 查询商户日账单汇总表列表 + */ + TableDataInfo queryPageList(VMerchantBillDayBo bo, PageQuery pageQuery); + + /** + * 查询商户日账单汇总表列表 + */ + List queryList(VMerchantBillDayBo bo); + + /** + * 新增商户日账单汇总表 + */ + Boolean insertByBo(VMerchantBillDayBo bo); + + /** + * 修改商户日账单汇总表 + */ + Boolean updateByBo(VMerchantBillDayBo bo); + + /** + * 校验并批量删除商户日账单汇总表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java new file mode 100644 index 0000000..553cd52 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户账单汇总表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IVMerchantBillService { + + /** + * 查询商户账单汇总表 + */ + VMerchantBillVo queryById(Long merId); + + /** + * 查询商户账单汇总表列表 + */ + TableDataInfo queryPageList(VMerchantBillBo bo, PageQuery pageQuery); + + /** + * 查询商户账单汇总表列表 + */ + List queryList(VMerchantBillBo bo); + + /** + * 新增商户账单汇总表 + */ + Boolean insertByBo(VMerchantBillBo bo); + + /** + * 修改商户账单汇总表 + */ + Boolean updateByBo(VMerchantBillBo bo); + + /** + * 校验并批量删除商户账单汇总表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java new file mode 100644 index 0000000..30f6034 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java @@ -0,0 +1,337 @@ +package org.dromara.payment.merchant.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户资金账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAccountServiceImpl extends BaseService implements IBusMerchantAccountService { + + private final BusMerchantAccountMapper baseMapper; + + private final BusAccountsMapper accountsMapper; + + private final BusMerchantMapper merchantMapper; + + private final SysSydMapper sydMapper; + + private final IBusOperatorAccountService busOperatorAccountService; + + @DubboReference + private RemoteAccountService accountService; + + @Autowired + private BusAccountsMapper busAccountsMapper; + + /** + * 查询商户资金账户 + */ + @Override + public BusMerchantAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户资金账户列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAccountBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户资金账户列表 + */ + @Override + public List queryList(BusMerchantAccountBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantAccount::getMerId, bo.getMerId()); + lqw.eq(bo.getSydId() != null, BusMerchantAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, BusMerchantAccount::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), BusMerchantAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), BusMerchantAccount::getBankVirtualCard, bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, BusMerchantAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, BusMerchantAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, BusMerchantAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, BusMerchantAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getSettlement() != null, BusMerchantAccount::getSettlement, bo.getSettlement()); + lqw.eq(bo.getInvoiceSettlement() != null, BusMerchantAccount::getInvoiceSettlement, bo.getInvoiceSettlement()); + lqw.eq(bo.getInvoice() != null, BusMerchantAccount::getInvoice, bo.getInvoice()); + lqw.eq(bo.getStatus() != null, BusMerchantAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), BusMerchantAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + /** + * 新增商户资金账户 + */ + @Override + public Boolean insertByBo(BusMerchantAccountBo bo) { + BusMerchantAccount add = MapstructUtils.convert(bo, BusMerchantAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户资金账户 + */ + @Override + public Boolean updateByBo(BusMerchantAccountBo bo) { + BusMerchantAccount update = MapstructUtils.convert(bo, BusMerchantAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户资金账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List getAccByMerIdAndSydId(Long merId, Long sydId) { + return baseMapper.getAccByMerIdAndSydId(merId,sydId); + } + + @Override + public BusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId, Long sydId) { + List list = baseMapper.getAccByMerIdAndSydId(merId,sydId); + for (BusMerchantAccountVo acc: + list) { + if(acc.getIsDefault() == 1){ + return acc; + } + } + return list.size() > 0 ? list.get(0) : null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateBalance(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateBalance(sydId,unitId,amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateFrozen(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateFrozen(sydId,unitId,amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusMerchantRechargeVo getRechargeAccount(int id) { + BusMerchantRechargeVo rtn = new BusMerchantRechargeVo(); + BusMerchantAccountVo acc = baseMapper.selectByAccId(id); + if(acc != null){ + BusMerchantVo merVo = merchantMapper.selectVoById(acc.getMerId()); + SysSydVo sydVo = sydMapper.selectVoById(acc.getSydId()); + rtn.setMerBankCard(merVo.getBankCard()); + rtn.setMerKhh(merVo.getKhh()); + rtn.setBankCard(acc.getBankVirtualCard()); + if (acc.getBankType().equals("支付宝")) { + rtn.setAccName(merVo.getKhm()); + rtn.setBankType("支付机构备付金集中存管账户"); + rtn.setKhh("支付宝-备付金账户"); + rtn.setKhd("上海市-上海市"); + rtn.setKhhNo("991290000015"); + }else{ +// rtn.setAccName(sydVo.getGsmc()); +// rtn.setBankType(acc.getBankType()); +// rtn.setKhh(sydVo.getKfh()); +// rtn.setKhd(sydVo.getKfd()); +// rtn.setKhhNo(sydVo.getKhhNo()); + + rtn.setAccName(acc.getName()); + rtn.setBankType(acc.getBankType()); + rtn.setKhh(acc.getKhh()); +// rtn.setKhd(sydVo.getKfd()); + rtn.setKhhNo(acc.getLhh()); + } + } + return rtn; + } + + @Override + public BusMerchantAccountVo getCashoutAccount(Long id) { + BusMerchantAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusMerchantVo vo = merchantMapper.selectVoById(rtn.getMerId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankVirtualCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } + + @Override + public List getMerAccountList(BusMerchantAccountBo bo, PageQuery pageQuery) { + if(bo.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + if(StringUtils.isEmpty(bo.getBankType())){ + this.invalidationParamsException("银行通道不能为空"); + } + return this.baseMapper.selectMerAccountLists(bo,pageQuery.build()); + } + + @Override + public Boolean createXnAccount(Long sydId, Long merId, String merName, String bankType) { + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + if(merId == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + if(StringUtils.isEmpty(merName)){ + this.invalidationParamsException("企业名称不能为空"); + } + if(StringUtils.isEmpty(bankType)){ + this.invalidationParamsException("银行类型不能为空"); + } + List accs = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + if(!accs.isEmpty()){ + return true; + } + Boolean sydRtn = busOperatorAccountService.creatXNnum(sydId,merId,merName, BusRole.MERCHANT.getId(),BusRole.PLATFORM.getId(),bankType, add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusMerchantAccount(null,merId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }, bankType1 -> { + List accs1 = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + return accs1.size() > 0 ? accs1.get(0).getBankVirtualCard() : null; + }); + return sydRtn; + } + + @Override + public Boolean createThirdXnAccount(Long sydId, Long merId, String merName, String bankType,String bankCard,String accName) { + + List accs = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + if(!accs.isEmpty()){ + return true; + } + + Account bankAcc = new Account(); + bankAcc.setType((short)1);//2:真实个人账户 + bankAcc.setBankCard(bankCard); + bankAcc.setBankType(bankType); + bankAcc.setUnitId(merId); + bankAcc.setName(accName); + bankAcc.setBankName(bankType); + bankAcc.setStatus((short)1); + Result addAccount = this.accountService.addAccount(bankAcc); + + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,merId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,BusRole.PLATFORM.getId(),rtnData.getName(), + rtnData.getBankName(), rtnData.getBankNo()); + busAccountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusMerchantAccount(null,merId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java new file mode 100644 index 0000000..227c0f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户账户同步Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAccountSynServiceImpl implements IBusMerchantAccountSynService { + + private final BusMerchantAccountSynMapper baseMapper; + + /** + * 查询商户账户同步 + */ + @Override + public BusMerchantAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户账户同步列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户账户同步列表 + */ + @Override + public List queryList(BusMerchantAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, BusMerchantAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, BusMerchantAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), BusMerchantAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, BusMerchantAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增商户账户同步 + */ + @Override + public Boolean insertByBo(BusMerchantAccountSynBo bo) { + BusMerchantAccountSyn add = MapstructUtils.convert(bo, BusMerchantAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户账户同步 + */ + @Override + public Boolean updateByBo(BusMerchantAccountSynBo bo) { + BusMerchantAccountSyn update = MapstructUtils.convert(bo, BusMerchantAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户账户同步 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java new file mode 100644 index 0000000..aadd4f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java @@ -0,0 +1,121 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.mapper.BusMerchantAgreementMapper; +import org.dromara.payment.merchant.service.IBusMerchantAgreementService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户协议Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAgreementServiceImpl implements IBusMerchantAgreementService { + + private final BusMerchantAgreementMapper baseMapper; + + /** + * 查询商户协议 + */ + @Override + public BusMerchantAgreementVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户协议列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAgreementBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户协议列表 + */ + @Override + public List queryList(BusMerchantAgreementBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAgreementBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantAgreement::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusMerchantAgreement::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusMerchantAgreement::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusMerchantAgreement::getOpId, bo.getOpId()); + lqw.eq(bo.getSignStyle() != null, BusMerchantAgreement::getSignStyle, bo.getSignStyle()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), BusMerchantAgreement::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchantAgreement::getNo, bo.getNo()); + lqw.eq(bo.getStatus() != null, BusMerchantAgreement::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), BusMerchantAgreement::getFileUrl, bo.getFileUrl()); + lqw.eq(bo.getChannelId() != null, BusMerchantAgreement::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusMerchantAgreement::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getMerId() != null, BusMerchantAgreement::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), BusMerchantAgreement::getMerNo, bo.getMerNo()); + return lqw; + } + + /** + * 新增商户协议 + */ + @Override + public Boolean insertByBo(BusMerchantAgreementBo bo) { + BusMerchantAgreement add = MapstructUtils.convert(bo, BusMerchantAgreement.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户协议 + */ + @Override + public Boolean updateByBo(BusMerchantAgreementBo bo) { + BusMerchantAgreement update = MapstructUtils.convert(bo, BusMerchantAgreement.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAgreement entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java new file mode 100644 index 0000000..fcefa6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java @@ -0,0 +1,280 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantFlowsMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.mapper.BusMerchantCashoutMapper; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantCashoutServiceImpl implements IBusMerchantCashoutService { + + private final BusMerchantCashoutMapper baseMapper; + + private final BusMerchantMapper merchantMapper; + + private final IBusMerchantAccountService busMerchantAccountService; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final BusMerchantFlowsMapper merchantFlowsMapper; + + private final IBusMerchantAccountService merchantAccountService; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询商户提现记录 + */ + @Override + public BusMerchantCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantCashoutBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户提现记录列表 + */ + @Override + public List queryList(BusMerchantCashoutBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantCashoutBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantCashout::getSydId, bo.getSydId()); + lqw.eq(bo.getMerId() != null, BusMerchantCashout::getMerId, bo.getMerId()); + lqw.eq(bo.getAccId() != null, BusMerchantCashout::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusMerchantCashout::getBusNo, bo.getBusNo()); + lqw.eq(bo.getAmount() != null, BusMerchantCashout::getAmount, bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusMerchantCashout::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusMerchantCashout::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusMerchantCashout::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusMerchantCashout::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusMerchantCashout::getBankCard, bo.getBankCard()); + lqw.eq(bo.getPayStatus() != null, BusMerchantCashout::getPayStatus, bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, BusMerchantCashout::getPayTime, bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), BusMerchantCashout::getPayRemark, bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, BusMerchantCashout::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchantCashout::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), BusMerchantCashout::getPassage, bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusMerchantCashout::getPayReceipt, bo.getPayReceipt()); + return lqw; + } + + /** + * 新增商户提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusMerchantCashoutBo bo) { + BusMerchantCashout add = MapstructUtils.convert(bo, BusMerchantCashout.class); + validEntityBeforeSave(add); + BusMerchantAccountVo vo = busMerchantAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + billService.checkPayPassword(BusRole.MERCHANT, vo.getMerId(), () -> { + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,vo.getMerId())); + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + String busDesc = "商户提现"; + if(merchantAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setMerId(vo.getMerId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankVirtualCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + add.setPayStatus(2l);//支付中 + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + Account bankAcc = new Account(); +// bankAcc.setBankType(add.getPassage()); + bankAcc.setBankType(add.getKhh()); + bankAcc.setBankCard(add.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(add.getFr()); + bankAcc.setType((short)3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //商户提现 + TranLog backLog = new TranLog(); + backLog.setBusType(6l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(add.getId()); + Result backRtn = accountService.applyTransfer(vo.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), add.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.MERCHANT.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.MERCHANT.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + } + return flag; + } + + /** + * 修改商户提现记录 + */ + @Override + public Boolean updateByBo(BusMerchantCashoutBo bo) { + BusMerchantCashout update = MapstructUtils.convert(bo, BusMerchantCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "商户提现"; + BusMerchantCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(merchantAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(merchantAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusMerchantCashout::getId,vo.getId()) + .eq(BusMerchantCashout::getPayStatus,2) + .set(BusMerchantCashout::getPayStatus,3) + .set(BusMerchantCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + BusMerchantVo merchant = merchantMapper.selectVoById(vo.getMerId()); + BusMerchantFlows merchantFlow = new BusMerchantFlows(2,vo.getMerId(),vo.getSydId(),14, vo.getPassage(), null,tran.getTargetBankNo(), -tran.getAmount(), new Date(),vo.getAddBy(),"提现", null, vo.getId(), null, tlog.getTranNo(), 3, tran.getResult().intValue(), tlog.getSourceAccType(), vo.getMerId(), merchant.getName(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, merchant.getName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1, ""); + merchantFlowsMapper.insertAll(Arrays.asList(merchantFlow)); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusMerchantCashout::getId,vo.getId()) + .eq(BusMerchantCashout::getPayStatus,2) + .set(BusMerchantCashout::getPayStatus,4) + .set(BusMerchantCashout::getPayTime,new Date()) + .set(BusMerchantCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java new file mode 100644 index 0000000..2332a48 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.merchant.service.IBusMerchantConfigService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户配置Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantConfigServiceImpl implements IBusMerchantConfigService { + + private final BusMerchantConfigMapper baseMapper; + + /** + * 查询商户配置 + */ + @Override + public BusMerchantConfigVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户配置列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户配置列表 + */ + @Override + public List queryList(BusMerchantConfigBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantConfig::getMerId, bo.getMerId()); + lqw.eq(bo.getAutoApprove() != null, BusMerchantConfig::getAutoApprove, bo.getAutoApprove()); + lqw.eq(bo.getValiWorker() != null, BusMerchantConfig::getValiWorker, bo.getValiWorker()); + return lqw; + } + + /** + * 新增商户配置 + */ + @Override + public Boolean insertByBo(BusMerchantConfigBo bo) { + BusMerchantConfig add = MapstructUtils.convert(bo, BusMerchantConfig.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户配置 + */ + @Override + public Boolean updateByBo(BusMerchantConfigBo bo) { + BusMerchantConfig update = MapstructUtils.convert(bo, BusMerchantConfig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantConfig entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java new file mode 100644 index 0000000..941b55c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java @@ -0,0 +1,218 @@ +package org.dromara.payment.merchant.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.mapper.BusMerchantFlowsMapper; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户流水Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantFlowsServiceImpl implements IBusMerchantFlowsService { + + private final BusMerchantFlowsMapper baseMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final IBusMerchantAccountService merchantAccountService; + + private final BusMerchantAccountSynMapper merchantAccountSynMapper; + + private final IMerBillDetailService billDetailService; + + /** + * 查询商户流水 + */ + @Override + public BusMerchantFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户流水列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantFlowsBo bo, PageQuery pageQuery) { + bo.setMerId(LoginHelper.getBusId()); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户流水列表 + */ + @Override + public List queryList(BusMerchantFlowsBo bo) { + + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantFlows::getMerId, bo.getMerId()); + lqw.eq(bo.getSydId() != null, BusMerchantFlows::getSydId, bo.getSydId()); + lqw.eq(bo.getBusType() != null, BusMerchantFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), BusMerchantFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusMerchantFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), BusMerchantFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, BusMerchantFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusMerchantFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusMerchantFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchantFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusMerchantFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusMerchantFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusMerchantFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusMerchantFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), BusMerchantFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, BusMerchantFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, BusMerchantFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, BusMerchantFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusMerchantFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusMerchantFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusMerchantFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusMerchantFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusMerchantFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusMerchantFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusMerchantFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusMerchantFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusMerchantFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusMerchantFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, BusMerchantFlows::getPayReceiptType, bo.getPayReceiptType()); + lqw.eq(StringUtils.isNotBlank(bo.getIllustrate()), BusMerchantFlows::getIllustrate, bo.getIllustrate()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(BusMerchantFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("acc_id"))){ + BusMerchantAccountVo acc = merchantAccountMapper.selectVoById(Long.parseLong(bo.getParams().get("acc_id").toString())); + lqw.and(i -> i.eq(BusMerchantFlows::getPayeeAccId,acc.getAccId()).or().eq(BusMerchantFlows::getPayerAccId,acc.getAccId())); + } + + lqw.orderByDesc(BusMerchantFlows::getId); + return lqw; + } + + /** + * 新增商户流水 + */ + @Override + public Boolean insertByBo(BusMerchantFlowsBo bo) { + BusMerchantFlows add = MapstructUtils.convert(bo, BusMerchantFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户流水 + */ + @Override + public Boolean updateByBo(BusMerchantFlowsBo bo) { + BusMerchantFlows update = MapstructUtils.convert(bo, BusMerchantFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long saveFlows(BusMerchantAccountVo acc, AccountSyn syn) { + Long addAmount = 0l; + List flows = new ArrayList(); + Long preMoney = 0l; + for (AccountLog log : syn.getLogs()) { + if(log.getTrxdir().intValue() == 1) { + boolean isRecharge = true;//是否充值 + //订单退票,过滤账单明细和提现业务 + if (StringUtils.isNotBlank(log.getNarinn()) && log.getNarinn().startsWith("bus")) { + //账单代发退回 + isRecharge = !billDetailService.refundBillDetail(log.getNarinn(),log.getTrxamt(),log.getTrxtxt()); + } + if(isRecharge) { + BusMerchantFlows flow = new BusMerchantFlows(); + flow.setDirection(1);//流水方向(1:收入 2:支出) + flow.setAddBy("系统"); + flow.setAddTime(new Date()); + flow.setBankNo(log.getTrxnbr()); + flow.setBusType(2);//商户充值 + flow.setChannel(syn.getBankType()); + flow.setMerId(acc.getMerId()); + flow.setMoney(log.getTrxamt()); + flow.setPreMoney(preMoney); + flow.setSydId(acc.getSydId()); + flow.setBusDesc("充值"); + flow.setTranStatus(2); + flow.setPayerName(log.getRpynam()); + flow.setPayerAcc(log.getRpyacc()); + flow.setTranType(7);//充值交易 + flow.setPayeeType(BusRole.MERCHANT.getId()); + flow.setPayeeId(acc.getMerId()); + flow.setPayeeName(acc.getMerName()); + flow.setPayeeAcc(acc.getBankVirtualCard()); + flow.setPayeeAccId(acc.getAccId()); + flows.add(flow); + preMoney += flow.getMoney(); + addAmount += flow.getMoney(); + } + } + } + baseMapper.insertAll(flows); + merchantAccountService.updateBalance(acc.getSydId(),acc.getMerId(), addAmount,acc.getBankType()); + merchantAccountSynMapper.update(new LambdaUpdateWrapper().eq(BusMerchantAccountSyn::getId,acc.getAccId()) + .set(BusMerchantAccountSyn::getSynPosition,syn.getLogs().get(syn.getLogs().size()-1).getId())); + return addAmount; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java new file mode 100644 index 0000000..dfb4a85 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java @@ -0,0 +1,235 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户产品表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantProductServiceImpl extends BaseService implements IBusMerchantProductService { + + private final BusMerchantProductMapper baseMapper; + + private final BusChannelProductMapper busChannelProductMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final IXyjService xyjService; + + /** + * 查询商户产品表 + */ + @Override + public BusMerchantProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户产品表列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantProductBo bo, PageQuery pageQuery) { + + if(bo.getBusType() == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(bo.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t1.bus_type",bo.getBusType()); + lqw.eq("t.mer_id",bo.getMerId()); + lqw.eq("t3.pro_status",1); + lqw.eq("t1.pro_status",1); + lqw.eq("t1.channel_id",LoginHelper.getBusId()); + + + Page result = baseMapper.selBusMerProByTypeList(pageQuery.build(), lqw); + result.getRecords().forEach(item->{ + item.setUnId(IdUtil.getSnowflakeNextId()+""); + }); + return TableDataInfo.build(result); + } + + /** + * 查询商户产品表列表 + */ + @Override + public List queryList(BusMerchantProductBo bo) { + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + lqw.eq("t3.pro_status",1); + lqw.eq("t.bus_type",bo.getBusType()); + lqw.eq("t.mer_id",LoginHelper.getBusId()); + lqw.eq("t.syd_id",bo.getSydId()); + lqw.orderByDesc("t.create_time"); + List list = this.baseMapper.selBusMerProList(lqw); + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusMerchantProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusMerchantProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusMerchantProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusMerchantProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusMerchantProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusMerchantProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusMerchantProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusMerchantProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChannelId() != null, BusMerchantProduct::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusMerchantProduct::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getMerId() != null, BusMerchantProduct::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), BusMerchantProduct::getMerNo, bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), BusMerchantProduct::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getChargeMode() != null, BusMerchantProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusMerchantProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusMerchantProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusMerchantProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusMerchantProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusMerchantProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增商户产品表 + */ + @Override + @Transactional + public Boolean insertByBo(JSONObject map) { + + String boListStr = map.getString("boList"); + Long bus_type = map.getLong("busType"); + Long mer_id = map.getLong("merId"); + String merNo = map.getString("merNo"); + if(bus_type == null){ + this.invalidationParamsException("业务类型不能为空"); + } + if(mer_id == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(StringUtils.isEmpty(merNo)){ + this.invalidationParamsException("企业编码不能为空"); + } + if(StringUtils.isEmpty(boListStr)){ + this.invalidationParamsException("请先配置产品"); + } + boListStr = map.getJSONArray("boList").toJSONString(); + Map paraMap = new HashMap(); + paraMap.put("channel_no", LoginHelper.getNo()); + paraMap.put("bus_type",bus_type); + List agentList = this.busChannelProductMapper.selectAgentProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前代理商未配置产品"); + } + List voList = JSONUtil.toList(boListStr, BusMerchantProductBo.class); + List insertList = new ArrayList(); + for(BusMerchantProductBo vo :voList){ + if (vo.getProNo().equals("P9490811577")){ + BusMerchant busMerchant = busMerchantMapper.selectById(mer_id); + xyjService.addMerchant(busMerchant,vo.getSydId()); + } + BusChannelProductVo agentVo = agentList.stream().filter(t -> t.getProNo().equals(vo.getProNo())).findFirst().orElse(null); + if(agentVo == null){ + this.invalidationParamsException("产品编码"+vo.getProNo()+"未配置"); + } + vo.setSydId(agentVo.getSydId()); + vo.setSydNo(agentVo.getSydNo()); + vo.setProId(agentVo.getProId()); + vo.setOpId(agentVo.getOpId()); + vo.setOpNo(agentVo.getOpNo()); + vo.setMerId(mer_id); + vo.setMerNo(merNo); + vo.setChannelId(agentVo.getChannelId()); + vo.setChannelNo(agentVo.getChannelNo()); + vo.setMaxMonth(agentVo.getMaxMonth()); +// vo.setInvoiceItems(agentVo.getInvoiceItems()); + vo.setCostServiceCharge(agentVo.getServiceCharge()); + + ValidatorUtils.validate(vo, AddGroup.class); + if(vo.getServiceCharge() != null && vo.getServiceCharge().compareTo(vo.getCostServiceCharge()) < 0){ + vo.setServiceCharge(vo.getCostServiceCharge()); + } + vo.setBusType(bus_type); + vo.setMerId(mer_id); + if(vo.getId() != null){ + vo.setMdyServiceCharge(vo.getServiceCharge()); + vo.setServiceCharge(null); + BusMerchantProduct update = MapstructUtils.convert(vo, BusMerchantProduct.class); + insertList.add(update); + }else{ + BusMerchantProduct add = MapstructUtils.convert(vo, BusMerchantProduct.class); + insertList.add(add); + } + + } + this.baseMapper.insertOrUpdateBatch(insertList); + return true; + } + + /** + * 修改商户产品表 + */ + @Override + public Boolean updateByBo(BusMerchantProductBo bo) { + BusMerchantProduct update = MapstructUtils.convert(bo, BusMerchantProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户产品表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java new file mode 100644 index 0000000..5612532 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java @@ -0,0 +1,115 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.mapper.BusMerchantProductSydMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductSydService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 企业产品服务商Service业务层处理 + * + * @author LionLi + * @date 2024-04-25 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantProductSydServiceImpl implements IBusMerchantProductSydService { + + private final BusMerchantProductSydMapper baseMapper; + + /** + * 查询企业产品服务商 + */ + @Override + public BusMerchantProductSydVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询企业产品服务商列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantProductSydBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询企业产品服务商列表 + */ + @Override + public List queryList(BusMerchantProductSydBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusMerchantProductSydBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + return lqw; + } + + /** + * 新增企业产品服务商 + */ + @Override + public Boolean insertByBo(BusMerchantProductSydBo bo) { + BusMerchantProductSyd add = MapstructUtils.convert(bo, BusMerchantProductSyd.class); + validEntityBeforeSave(add); + add.setCreateBy(LoginHelper.getUserId()); + add.setCreateTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改企业产品服务商 + */ + @Override + public Boolean updateByBo(BusMerchantProductSydBo bo) { + BusMerchantProductSyd update = MapstructUtils.convert(bo, BusMerchantProductSyd.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantProductSyd entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除企业产品服务商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java new file mode 100644 index 0000000..08ca499 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java @@ -0,0 +1,417 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 商户Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantServiceImpl extends BaseService implements IBusMerchantService { + + private final BusMerchantMapper baseMapper; + + private final BusMerchantConfigMapper merchantConfigMapper; + + private final MerInvoiceAddressMapper merInvoiceAddressMapper; + + @Resource + private ISysUnitService sysUnitService; + + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + /** + * 查询商户 + */ + @Override + public BusMerchantVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getScaleName()),"s.name",bo.getScaleName()); + if(bo.getIsProduct() != null && bo.getIsProduct() == 1){ + lqw.eq("t.create_unit_id",LoginHelper.getBusId()); + } + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.SERVICE.getId()){ + lqw.inSql("t.id","select distinct mer_id from bus_merchant_product tt where tt.syd_id ="+LoginHelper.getBusId()); + } + + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selectMerchantList(pageQuery.build(), lqw); + + result.getRecords().forEach(item->{ + item.setPayPassword(null); + if(item.getCreateUnitId() != null && item.getCreateUnitId().equals(LoginHelper.getBusId())){ + item.setIsCanSetScale(1); + } + }); + return TableDataInfo.build(result); + } + + /** + * 查询商户列表 + */ + @Override + public List queryList(BusMerchantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchant::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), BusMerchant::getIndustry, bo.getIndustry()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusMerchant::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameNc()), BusMerchant::getNameNc, bo.getNameNc()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusMerchant::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusMerchant::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusMerchant::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusMerchant::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusMerchant::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusMerchant::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusMerchant::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusMerchant::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusMerchant::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusMerchant::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusMerchant::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusMerchant::getAddress, bo.getAddress()); + lqw.eq(bo.getYyzzBeginDate() != null, BusMerchant::getYyzzBeginDate, bo.getYyzzBeginDate()); + lqw.eq(bo.getYyzzEndDate() != null, BusMerchant::getYyzzEndDate, bo.getYyzzEndDate()); + lqw.eq(StringUtils.isNotBlank(bo.getYyzz()), BusMerchant::getYyzz, bo.getYyzz()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), BusMerchant::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, BusMerchant::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, BusMerchant::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.eq(bo.getStatus() != null, BusMerchant::getStatus, bo.getStatus()); + lqw.eq(bo.getAddTime() != null, BusMerchant::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchant::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), BusMerchant::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, BusMerchant::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusMerchant::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusMerchant::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusMerchant::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusMerchant::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getJbckzhbm()), BusMerchant::getJbckzhbm, bo.getJbckzhbm()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), BusMerchant::getPassage, bo.getPassage()); + lqw.eq(bo.getFrCardidBeginDate() != null, BusMerchant::getFrCardidBeginDate, bo.getFrCardidBeginDate()); + lqw.eq(bo.getFrCardidEndDate() != null, BusMerchant::getFrCardidEndDate, bo.getFrCardidEndDate()); + lqw.eq(bo.getJbrCardidBeginDate() != null, BusMerchant::getJbrCardidBeginDate, bo.getJbrCardidBeginDate()); + lqw.eq(bo.getJbrCardidEndDate() != null, BusMerchant::getJbrCardidEndDate, bo.getJbrCardidEndDate()); + lqw.eq(bo.getYwyId() != null, BusMerchant::getYwyId, bo.getYwyId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), BusMerchant::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), BusMerchant::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), BusMerchant::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), BusMerchant::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), BusMerchant::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), BusMerchant::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.eq(StringUtils.isNotBlank(bo.getFhxkzPic()), BusMerchant::getFhxkzPic, bo.getFhxkzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusMerchant::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusMerchant::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzzm()), BusMerchant::getJbrSfzzm, bo.getJbrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzfm()), BusMerchant::getJbrSfzfm, bo.getJbrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getMtqjzPic()), BusMerchant::getMtqjzPic, bo.getMtqjzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp1Pic()), BusMerchant::getBgzp1Pic, bo.getBgzp1Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp2Pic()), BusMerchant::getBgzp2Pic, bo.getBgzp2Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjzsxcnh()), BusMerchant::getYwcjzsxcnh, bo.getYwcjzsxcnh()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjsm()), BusMerchant::getYwcjsm, bo.getYwcjsm()); + lqw.eq(StringUtils.isNotBlank(bo.getFddsqxy()), BusMerchant::getFddsqxy, bo.getFddsqxy()); + lqw.eq(StringUtils.isNotBlank(bo.getTshyxkz()), BusMerchant::getTshyxkz, bo.getTshyxkz()); + lqw.eq(bo.getVerifyStatus() != null, BusMerchant::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, BusMerchant::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), BusMerchant::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), BusMerchant::getVerifyReason, bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getScale()), BusMerchant::getScale, bo.getScale()); + lqw.eq(StringUtils.isNotBlank(bo.getLogo()), BusMerchant::getLogo, bo.getLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getIntroduce()), BusMerchant::getIntroduce, bo.getIntroduce()); + lqw.eq(bo.getSalesmanId() != null, BusMerchant::getSalesmanId, bo.getSalesmanId()); + lqw.eq(bo.getIsValiAcc() != null, BusMerchant::getIsValiAcc, bo.getIsValiAcc()); + return lqw; + } + + /** + * 新增商户 + */ + @Override + @Transactional + public Boolean insertByBo(BusMerchantBo bo) { + + Long id = IdUtil.getSnowflakeNextId(); + + bo.setId(id); + bo.setCreateBy(LoginHelper.getUserId()); + bo.setCreateTime(new Date()); + bo.setSalesmanId(bo.getYwyId()); + bo.setVerifyStatus(0L); + if(StringUtils.isEmpty(bo.getNo())){ + bo.setNo(LoginHelper.getNo()+"-"+this.getMerNo()); + } + String pCode = LoginHelper.getNo(); + if(StringUtils.isNotEmpty(pCode)){ + String[] pcs = pCode.split("-"); + bo.setOperatorNo(pcs[0]); + if(pcs.length >= 2){ + bo.setAgentNo(pCode); + } + } + BusMerchant add = MapstructUtils.convert(bo, BusMerchant.class); + validEntityBeforeSave(add); + add.setCreateUnitId(LoginHelper.getBusId()); + add.setCreateUnitNo(LoginHelper.getNo()); + + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch (Exception e){ + if( e instanceof DuplicateKeyException){ + bo.setNo(LoginHelper.getNo()+"-"+this.getMerNo()); + return this.insertByBo(bo); + } + throw e; + } + if (flag) { + bo.setId(add.getId()); + } + + SysUnitBo sysUnitBo = new SysUnitBo(); + sysUnitBo.setName(bo.getName()); + sysUnitBo.setId(id); + sysUnitBo.setUnitType(BusRole.MERCHANT.getId()); + sysUnitBo.setNo(add.getNo()); + sysUnitBo.setCreateBy(add.getCreateBy()); + sysUnitBo.setCreateTime(add.getCreateTime()); + this.sysUnitService.insertByBo(sysUnitBo); + + + BusMerchantConfig busMerchantConfig = new BusMerchantConfig(); + busMerchantConfig.setMerId(add.getId()); + busMerchantConfig.setAutoApprove(1); + busMerchantConfig.setValiWorker(1); + busMerchantConfig.setCreateTime(new Date()); + + this.merchantConfigMapper.insert(busMerchantConfig); + + + + return flag; + } + + private String getMerNo() { + return "M"+RandomUtil.randomString("0123456789",5); + } + + /** + * 修改商户 + */ + @Override + public Boolean updateByBo(BusMerchantBo bo) { + + BusMerchantVo vo = this.baseMapper.selectVoById(bo.getId()); + if(vo == null){ + this.invalidationParamsException("无效主键!"); + } + + if(vo.getVerifyStatus() == null || vo.getVerifyStatus().equals(2L)){ + this.invalidationParamsException("此状态下不能修改企业信息"); + } + BusMerchant update = MapstructUtils.convert(bo, BusMerchant.class); + update.setNo(null); + update.setVerifyStatus(0L); + update.setAgentNo(null); + update.setOperatorNo(null); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchant entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public int setYwy(Long id, Long ywyId) { + + if(id == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(ywyId == null){ + this.invalidationParamsException("业务员ID不能为空"); + } + BusMerchant bm = new BusMerchant(); + bm.setYwyId(ywyId); + bm.setSalesmanId(bm.getYwyId()); + bm.setUpdateBy(LoginHelper.getUserId()); + bm.setUpdateTime(new Date()); + bm.setId(id); + this.baseMapper.setAndUnbindYwy(bm); + return 1; + } + + @Override + public Boolean checkMerChant(Long merId, Long checkType, String reason, String domain) { + + if(merId == null){ + this.invalidationParamsException("商户ID不能为空"); + } + + if(checkType == null){ + this.invalidationParamsException("审核类型不能为空"); + } + + if(checkType.intValue() == 1 && StringUtils.isEmpty(reason)){ + this.invalidationParamsException("驳回原因不能为空"); + } + + if(StringUtils.isEmpty(domain)){ + this.invalidationParamsException("域名不能为空"); + } + + BusMerchantVo bcv = this.baseMapper.selectVoById(merId); + + if(bcv == null){ + this.invalidationParamsException("商户ID无效"); + } + + if(checkType.intValue() == 2){ + + MerInvoiceAddress invoiceAddress = new MerInvoiceAddress(); + invoiceAddress.setMerId(bcv.getId()); + invoiceAddress.setMerNo(bcv.getNo()); + invoiceAddress.setBankCard(bcv.getBankCard()); + invoiceAddress.setHeader(bcv.getName()); + invoiceAddress.setBankAddress(bcv.getKhd()); + invoiceAddress.setNsrSbh(bcv.getInvoceCreditCode()); + invoiceAddress.setUnitAddress(bcv.getInvoceAddress()); + invoiceAddress.setUnitPhone(bcv.getInvoceDwdh()); + this.merInvoiceAddressMapper.insert(invoiceAddress); + + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(merId); + remoteUserBo.setBusNo(bcv.getNo()); + remoteUserBo.setRoleId(BusRole.MERCHANT.getId()); + remoteUserBo.setRoleName(BusRole.MERCHANT.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bcv.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bcv.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("M"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addBusUser(remoteUserBo); + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.MERCHANT.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(domain,remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + } + + BusMerchant busMerchant = new BusMerchant(); + busMerchant.setVerifyStatus(checkType); + busMerchant.setVerifyReason(reason); + busMerchant.setVerifyTime(new Date()); + busMerchant.setVerifyBy(LoginHelper.getUserId()+""); + busMerchant.setId(merId); + this.baseMapper.updateById(busMerchant); + return true; + } + + + private void addBusUser(RemoteUserBo remoteUserBo) { + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("M"+StringUtils.randmNumber(5)); + this.addBusUser(remoteUserBo); + } + } + @Override + public Integer unbindYwy(Long id, Long ywyId) { + + + if(id == null){ + this.invalidationParamsException("主键ID不能为空"); + } + + + BusMerchant bm = new BusMerchant(); + bm.setYwyId(null); + bm.setSalesmanId(null); + bm.setUpdateBy(LoginHelper.getUserId()); + bm.setUpdateTime(new Date()); + bm.setId(id); + this.baseMapper.setAndUnbindYwy(bm); + return 1; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java new file mode 100644 index 0000000..79b39f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java @@ -0,0 +1,169 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.mapper.PubMerchantMapper; +import org.dromara.payment.merchant.service.IPubMerchantService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户申请表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class PubMerchantServiceImpl implements IPubMerchantService { + + private final PubMerchantMapper baseMapper; + + /** + * 查询商户申请表 + */ + @Override + public PubMerchantVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户申请表列表 + */ + @Override + public TableDataInfo queryPageList(PubMerchantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户申请表列表 + */ + @Override + public List queryList(PubMerchantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(PubMerchantBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), PubMerchant::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), PubMerchant::getIndustry, bo.getIndustry()); + lqw.like(StringUtils.isNotBlank(bo.getName()), PubMerchant::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameNc()), PubMerchant::getNameNc, bo.getNameNc()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), PubMerchant::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), PubMerchant::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), PubMerchant::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), PubMerchant::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrZjlx()), PubMerchant::getWtrZjlx, bo.getWtrZjlx()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), PubMerchant::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), PubMerchant::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), PubMerchant::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), PubMerchant::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), PubMerchant::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrZjlx()), PubMerchant::getFrZjlx, bo.getFrZjlx()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), PubMerchant::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), PubMerchant::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), PubMerchant::getAddress, bo.getAddress()); + lqw.eq(bo.getYyzzBeginDate() != null, PubMerchant::getYyzzBeginDate, bo.getYyzzBeginDate()); + lqw.eq(bo.getYyzzEndDate() != null, PubMerchant::getYyzzEndDate, bo.getYyzzEndDate()); + lqw.eq(StringUtils.isNotBlank(bo.getYyzz()), PubMerchant::getYyzz, bo.getYyzz()); + lqw.eq(bo.getStatus() != null, PubMerchant::getStatus, bo.getStatus()); + lqw.eq(bo.getAddTime() != null, PubMerchant::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), PubMerchant::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), PubMerchant::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, PubMerchant::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), PubMerchant::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), PubMerchant::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), PubMerchant::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), PubMerchant::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getJbckzhbm()), PubMerchant::getJbckzhbm, bo.getJbckzhbm()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), PubMerchant::getPassage, bo.getPassage()); + lqw.eq(bo.getFrCardidBeginDate() != null, PubMerchant::getFrCardidBeginDate, bo.getFrCardidBeginDate()); + lqw.eq(bo.getFrCardidEndDate() != null, PubMerchant::getFrCardidEndDate, bo.getFrCardidEndDate()); + lqw.eq(bo.getJbrCardidBeginDate() != null, PubMerchant::getJbrCardidBeginDate, bo.getJbrCardidBeginDate()); + lqw.eq(bo.getJbrCardidEndDate() != null, PubMerchant::getJbrCardidEndDate, bo.getJbrCardidEndDate()); + lqw.eq(bo.getYwyId() != null, PubMerchant::getYwyId, bo.getYwyId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), PubMerchant::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), PubMerchant::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), PubMerchant::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), PubMerchant::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), PubMerchant::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), PubMerchant::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.eq(StringUtils.isNotBlank(bo.getFhxkzPic()), PubMerchant::getFhxkzPic, bo.getFhxkzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), PubMerchant::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), PubMerchant::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzzm()), PubMerchant::getJbrSfzzm, bo.getJbrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzfm()), PubMerchant::getJbrSfzfm, bo.getJbrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getMtqjzPic()), PubMerchant::getMtqjzPic, bo.getMtqjzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp1Pic()), PubMerchant::getBgzp1Pic, bo.getBgzp1Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp2Pic()), PubMerchant::getBgzp2Pic, bo.getBgzp2Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjzsxcnh()), PubMerchant::getYwcjzsxcnh, bo.getYwcjzsxcnh()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjsm()), PubMerchant::getYwcjsm, bo.getYwcjsm()); + lqw.eq(StringUtils.isNotBlank(bo.getFddsqxy()), PubMerchant::getFddsqxy, bo.getFddsqxy()); + lqw.eq(StringUtils.isNotBlank(bo.getTshyxkz()), PubMerchant::getTshyxkz, bo.getTshyxkz()); + lqw.eq(StringUtils.isNotBlank(bo.getLcqrh()), PubMerchant::getLcqrh, bo.getLcqrh()); + lqw.eq(bo.getVerifyStatus() != null, PubMerchant::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, PubMerchant::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), PubMerchant::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), PubMerchant::getVerifyReason, bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getZyyw()), PubMerchant::getZyyw, bo.getZyyw()); + return lqw; + } + + /** + * 新增商户申请表 + */ + @Override + public Boolean insertByBo(PubMerchantBo bo) { + PubMerchant add = MapstructUtils.convert(bo, PubMerchant.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户申请表 + */ + @Override + public Boolean updateByBo(PubMerchantBo bo) { + PubMerchant update = MapstructUtils.convert(bo, PubMerchant.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PubMerchant entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户申请表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java new file mode 100644 index 0000000..2f9bb3d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.mapper.VMerchantBillDayMapper; +import org.dromara.payment.merchant.service.IVMerchantBillDayService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户日账单汇总表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class VMerchantBillDayServiceImpl implements IVMerchantBillDayService { + + private final VMerchantBillDayMapper baseMapper; + + /** + * 查询商户日账单汇总表 + */ + @Override + public VMerchantBillDayVo queryById(Long merId){ + return baseMapper.selectVoById(merId); + } + + /** + * 查询商户日账单汇总表列表 + */ + @Override + public TableDataInfo queryPageList(VMerchantBillDayBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户日账单汇总表列表 + */ + @Override + public List queryList(VMerchantBillDayBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VMerchantBillDayBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), VMerchantBillDay::getMerNo, bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), VMerchantBillDay::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), VMerchantBillDay::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, VMerchantBillDay::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, VMerchantBillDay::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), VMerchantBillDay::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), VMerchantBillDay::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getDayTranNum() != null, VMerchantBillDay::getDayTranNum, bo.getDayTranNum()); + lqw.eq(bo.getDayTranMoney() != null, VMerchantBillDay::getDayTranMoney, bo.getDayTranMoney()); + return lqw; + } + + /** + * 新增商户日账单汇总表 + */ + @Override + public Boolean insertByBo(VMerchantBillDayBo bo) { + VMerchantBillDay add = MapstructUtils.convert(bo, VMerchantBillDay.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setMerId(add.getMerId()); + } + return flag; + } + + /** + * 修改商户日账单汇总表 + */ + @Override + public Boolean updateByBo(VMerchantBillDayBo bo) { + VMerchantBillDay update = MapstructUtils.convert(bo, VMerchantBillDay.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(VMerchantBillDay entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户日账单汇总表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java new file mode 100644 index 0000000..6918082 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java @@ -0,0 +1,122 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.mapper.VMerchantBillMapper; +import org.dromara.payment.merchant.service.IVMerchantBillService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户账单汇总表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class VMerchantBillServiceImpl implements IVMerchantBillService { + + private final VMerchantBillMapper baseMapper; + + /** + * 查询商户账单汇总表 + */ + @Override + public VMerchantBillVo queryById(Long merId){ + return baseMapper.selectVoById(merId); + } + + /** + * 查询商户账单汇总表列表 + */ + @Override + public TableDataInfo queryPageList(VMerchantBillBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户账单汇总表列表 + */ + @Override + public List queryList(VMerchantBillBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VMerchantBillBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), VMerchantBill::getMerNo, bo.getMerNo()); + lqw.eq(bo.getSydId() != null, VMerchantBill::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), VMerchantBill::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), VMerchantBill::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, VMerchantBill::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, VMerchantBill::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), VMerchantBill::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), VMerchantBill::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getDayTranNum() != null, VMerchantBill::getDayTranNum, bo.getDayTranNum()); + lqw.eq(bo.getDayTranMoney() != null, VMerchantBill::getDayTranMoney, bo.getDayTranMoney()); + lqw.eq(bo.getMonthTranNum() != null, VMerchantBill::getMonthTranNum, bo.getMonthTranNum()); + lqw.eq(bo.getMonthTranMoney() != null, VMerchantBill::getMonthTranMoney, bo.getMonthTranMoney()); + lqw.eq(bo.getYearTranNum() != null, VMerchantBill::getYearTranNum, bo.getYearTranNum()); + lqw.eq(bo.getYearTranMoney() != null, VMerchantBill::getYearTranMoney, bo.getYearTranMoney()); + return lqw; + } + + /** + * 新增商户账单汇总表 + */ + @Override + public Boolean insertByBo(VMerchantBillBo bo) { + VMerchantBill add = MapstructUtils.convert(bo, VMerchantBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setMerId(add.getMerId()); + } + return flag; + } + + /** + * 修改商户账单汇总表 + */ + @Override + public Boolean updateByBo(VMerchantBillBo bo) { + VMerchantBill update = MapstructUtils.convert(bo, VMerchantBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(VMerchantBill entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户账单汇总表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java new file mode 100644 index 0000000..b9af600 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java @@ -0,0 +1,136 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商资金账户 + * 前端访问路由地址为:/payment/operatorAccount + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorAccount") +public class BusOperatorAccountController extends BaseController { + + private final IBusOperatorAccountService busOperatorAccountService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询运营商资金账户列表 + */ + @SaCheckPermission("payment:operatorAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + TableDataInfo rtn = busOperatorAccountService.queryPageList(bo, pageQuery); + return rtn; + } + + + + @GetMapping("/listFp") + @Log(title = "结算账户分配查询", businessType = BusinessType.EXPORT) + public R getQueryList(BusOperatorAccountBo bo, PageQuery pageQuery){ + return R.ok(this.busOperatorAccountService.queryListFp(bo,pageQuery)); + } + + + @PostMapping("/createXn") + @Log(title = "创建运营商虚拟户", businessType = BusinessType.INSERT) + public R createXnAccount(Long sydId,Long opId,String opName,String bankType){ + return R.ok(this.busOperatorAccountService.createXnAccount(sydId,opId,opName,bankType)); + } + + + /** + * 导出运营商资金账户列表 + */ + @SaCheckPermission("payment:operatorAccount:export") + @Log(title = "运营商资金账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorAccountBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + List list = busOperatorAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商资金账户", BusOperatorAccountVo.class, response); + } + + /** + * 获取运营商资金账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorAccountService.queryById(id)); + } + + /** + * 新增运营商资金账户 + */ + @SaCheckPermission("payment:operatorAccount:add") + @Log(title = "运营商资金账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorAccountBo bo) { + return toAjax(busOperatorAccountService.insertByBo(bo)); + } + + /** + * 修改运营商资金账户 + */ + @SaCheckPermission("payment:operatorAccount:edit") + @Log(title = "运营商资金账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorAccountBo bo) { + return toAjax(busOperatorAccountService.updateByBo(bo)); + } + + /** + * 删除运营商资金账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorAccount:remove") + @Log(title = "运营商资金账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java new file mode 100644 index 0000000..9f05d6b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.payment.operator.service.IBusOperatorAgreementService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商协议 + * 前端访问路由地址为:/payment/operatorAgreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorAgreement") +public class BusOperatorAgreementController extends BaseController { + + private final IBusOperatorAgreementService busOperatorAgreementService; + + /** + * 查询运营商协议列表 + */ + @SaCheckPermission("payment:operatorAgreement:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorAgreementBo bo, PageQuery pageQuery) { + return busOperatorAgreementService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商协议列表 + */ + @SaCheckPermission("payment:operatorAgreement:export") + @Log(title = "运营商协议", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorAgreementBo bo, HttpServletResponse response) { + List list = busOperatorAgreementService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商协议", BusOperatorAgreementVo.class, response); + } + + /** + * 获取运营商协议详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorAgreement:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorAgreementService.queryById(id)); + } + + /** + * 新增运营商协议 + */ + @SaCheckPermission("payment:operatorAgreement:add") + @Log(title = "运营商协议", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorAgreementBo bo) { + return toAjax(busOperatorAgreementService.insertByBo(bo)); + } + + /** + * 修改运营商协议 + */ + @SaCheckPermission("payment:operatorAgreement:edit") + @Log(title = "运营商协议", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorAgreementBo bo) { + return toAjax(busOperatorAgreementService.updateByBo(bo)); + } + + /** + * 删除运营商协议 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorAgreement:remove") + @Log(title = "运营商协议", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorAgreementService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java new file mode 100644 index 0000000..5b069df --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java @@ -0,0 +1,154 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商提现记录 + * 前端访问路由地址为:/payment/operatorCashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorCashout") +public class BusOperatorCashoutController extends BaseController { + + private final IBusOperatorCashoutService busOperatorCashoutService; + + private final IBusOperatorAccountService operatorAccountService; + + private void bindDataPermission(BusOperatorCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId()); + } + } + + /** + * 查询运营商提现记录列表 + */ + @SaCheckPermission("payment:operatorCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorCashoutBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return busOperatorCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商提现记录列表 + */ + @SaCheckPermission("payment:operatorCashout:export") + @Log(title = "运营商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorCashoutBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busOperatorCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商提现记录", BusOperatorCashoutVo.class, response); + } + + /** + * 获取运营商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorCashoutService.queryById(id)); + } + + /** + * 获取运营商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(operatorAccountService.getCashoutAccount(id)); + } + + /** + * 新增运营商提现记录 + */ +// @SaCheckPermission("payment:operatorCashout:add") + @Log(title = "运营商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busOperatorCashoutService.insertByBo(bo)); + } + + /** + * 审批运营商提现记录 + */ + @Log(title = "审批运营商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/verifyCashout") + public R verifyCashout(@Positive(message = "提现记录id无效") long id,@Positive(message = "审核是否通过无效") long verifyStatus,String verifyReason) { + LoginUser loginUser = LoginHelper.getLoginUser(); + BusOperatorCashoutBo bo = new BusOperatorCashoutBo(); + bo.setId(id); + bo.setVerifyStatus(verifyStatus); + bo.setVerifyReason(verifyReason); + bo.setVerifyBy(loginUser.getNickname()); + return toAjax(busOperatorCashoutService.verifyCashout(bo)); + } + + /** + * 修改运营商提现记录 + */ + @SaCheckPermission("payment:operatorCashout:edit") + @Log(title = "运营商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorCashoutBo bo) { + return toAjax(busOperatorCashoutService.updateByBo(bo)); + } + + /** + * 删除运营商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorCashout:remove") + @Log(title = "运营商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java new file mode 100644 index 0000000..af72af8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java @@ -0,0 +1,129 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商 + * 前端访问路由地址为:/payment/operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operator") +public class BusOperatorController extends BaseController { + + private final IBusOperatorService busOperatorService; + + /** + * 查询运营商列表 + */ + @SaCheckPermission("payment:operator:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorBo bo, PageQuery pageQuery) { + return busOperatorService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商列表 + */ + @SaCheckPermission("payment:operator:export") + @Log(title = "运营商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorBo bo, HttpServletResponse response) { + List list = busOperatorService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商", BusOperatorVo.class, response); + } + + /** + * 获取运营商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operator:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorService.queryById(id)); + } + + /** + * 新增运营商 + */ + @SaCheckPermission("payment:operator:add") + @Log(title = "运营商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setCreateBy(loginUser.getUserId()); + return toAjax(busOperatorService.insertByBo(bo)); + } + + /** + * 修改运营商 + */ + @SaCheckPermission("payment:operator:edit") + @Log(title = "运营商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setUpdateBy(loginUser.getUserId()); + return toAjax(busOperatorService.updateByBo(bo)); + } + + /** + * 删除运营商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operator:remove") + @Log(title = "运营商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorService.deleteWithValidByIds(List.of(ids), true)); + } + + + /**** + * 得到运营商的银行信息 + * @return + */ + @GetMapping("/getBank") + @Log(title = "获取运营商的公户银行信息", businessType = BusinessType.DELETE) + public R getOperatorBankInfo(){ + BusOperatorVo resultVo = new BusOperatorVo(); + BusOperatorVo operatorVo = this.busOperatorService.queryById(LoginHelper.getBusId()); + resultVo.setBankCard(operatorVo.getBankCard()); + resultVo.setKhd(operatorVo.getKhd()); + return R.ok(resultVo); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java new file mode 100644 index 0000000..e506645 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java @@ -0,0 +1,119 @@ +package org.dromara.payment.operator.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.payment.operator.service.IBusOperatorFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商流水 + * 前端访问路由地址为:/payment/operatorFlows + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorFlows") +public class BusOperatorFlowsController extends BaseController { + + private final IBusOperatorFlowsService busOperatorFlowsService; + + /** + * 查询运营商流水列表 + */ + @SaCheckPermission("payment:operatorFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorFlowsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + return busOperatorFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商流水列表 + */ + @SaCheckPermission("payment:operatorFlows:export") + @Log(title = "运营商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorFlowsBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + List list = busOperatorFlowsService.queryList(bo); + ExcelUtil.exportExcelInclude(list, "运营商流水", BusOperatorFlowsVo.class, response,fieldList); + } + + /** + * 获取运营商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorFlowsService.queryById(id)); + } + + /** + * 新增运营商流水 + */ + @SaCheckPermission("payment:operatorFlows:add") + @Log(title = "运营商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorFlowsBo bo) { + return toAjax(busOperatorFlowsService.insertByBo(bo)); + } + + /** + * 修改运营商流水 + */ + @SaCheckPermission("payment:operatorFlows:edit") + @Log(title = "运营商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorFlowsBo bo) { + return toAjax(busOperatorFlowsService.updateByBo(bo)); + } + + /** + * 删除运营商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorFlows:remove") + @Log(title = "运营商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java new file mode 100644 index 0000000..e9cac45 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java @@ -0,0 +1,134 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.payment.operator.service.IBusOperatorProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商产品 + * 前端访问路由地址为:/payment/operatorProduct + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorProduct") +public class BusOperatorProductController extends BaseController { + + private final IBusOperatorProductService busOperatorProductService; + + /** + * 查询运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorProductBo bo, PageQuery pageQuery) { + return busOperatorProductService.queryPageList(bo, pageQuery); + } + + + + /** + * 查询运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:list") + @GetMapping("/listNew") + public TableDataInfo listNew(BusOperatorProductBo bo, PageQuery pageQuery) { + return busOperatorProductService.queryPageListNew(bo, pageQuery); + } + + + + + + + /** + * 导出运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:export") + @Log(title = "运营商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorProductBo bo, HttpServletResponse response) { + List list = busOperatorProductService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商产品", BusOperatorProductVo.class, response); + } + + /** + * 获取运营商产品详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorProductService.queryById(id)); + } + + /** + * 新增运营商产品 + */ + @SaCheckPermission("payment:operatorProduct:add") + @Log(title = "运营商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorProductBo bo) { + return toAjax(busOperatorProductService.insertByBo(bo)); + } + + /** + * 修改运营商产品 + */ + @SaCheckPermission("payment:operatorProduct:edit") + @Log(title = "运营商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorProductBo bo) { + return toAjax(busOperatorProductService.updateByBo(bo)); + } + + /** + * 删除运营商产品 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorProduct:remove") + @Log(title = "运营商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorProductService.deleteWithValidByIds(List.of(ids), true)); + } + + @Log(title = "给运营商分配产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/allocOperatorProduct") + public R allocOperatorProduct(@Validated() @RequestBody AllocOperatorProductBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setCreateBy(loginUser.getUserId()); + return toAjax(busOperatorProductService.allocOperatorProduct(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java new file mode 100644 index 0000000..bbf6327 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.service.IReProductInvoiceService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 产品开票类目 + * 前端访问路由地址为:/payment/productInvoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/productInvoice") +public class ReProductInvoiceController extends BaseController { + + private final IReProductInvoiceService reProductInvoiceService; + + /** + * 查询产品开票类目列表 + */ + @SaCheckPermission("payment:productInvoice:list") + @GetMapping("/list") + public TableDataInfo list(ReProductInvoiceBo bo, PageQuery pageQuery) { + return reProductInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 导出产品开票类目列表 + */ + @SaCheckPermission("payment:productInvoice:export") + @Log(title = "产品开票类目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ReProductInvoiceBo bo, HttpServletResponse response) { + List list = reProductInvoiceService.queryList(bo); + ExcelUtil.exportExcel(list, "产品开票类目", ReProductInvoiceVo.class, response); + } + + /** + * 获取产品开票类目详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:productInvoice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(reProductInvoiceService.queryById(id)); + } + + /** + * 新增产品开票类目 + */ + @SaCheckPermission("payment:productInvoice:add") + @Log(title = "产品开票类目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ReProductInvoiceBo bo) { + return toAjax(reProductInvoiceService.insertByBo(bo)); + } + + /** + * 修改产品开票类目 + */ + @SaCheckPermission("payment:productInvoice:edit") + @Log(title = "产品开票类目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ReProductInvoiceBo bo) { + return toAjax(reProductInvoiceService.updateByBo(bo)); + } + + /** + * 删除产品开票类目 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:productInvoice:remove") + @Log(title = "产品开票类目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(reProductInvoiceService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java new file mode 100644 index 0000000..40a4cf3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java @@ -0,0 +1,206 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator") +public class BusOperator extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.INPUT) + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 运营商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java new file mode 100644 index 0000000..cd88962 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java @@ -0,0 +1,139 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商资金账户对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_account") +public class BusOperatorAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperatorAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public BusOperatorAccount(Long id,Long sydId, Long accId,String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String name,String khh,String lhh) { + super(); + this.opId = id; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankVirtualCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 运营商id + */ + private Long opId; + + private String name; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 提现中金额(分) + */ + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java new file mode 100644 index 0000000..f779781 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java @@ -0,0 +1,76 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 运营商协议对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_agreement") +public class BusOperatorAgreement extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java new file mode 100644 index 0000000..bf12ac5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java @@ -0,0 +1,158 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商提现记录对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_cashout") +public class BusOperatorCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 发票图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java new file mode 100644 index 0000000..ea350e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java @@ -0,0 +1,216 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商流水对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_flows") +public class BusOperatorFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperatorFlows(){} + + public BusOperatorFlows(Integer direction,Long opId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType) { + this.opId = opId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java new file mode 100644 index 0000000..c4d6d54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java @@ -0,0 +1,107 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 运营商产品对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_product") +public class BusOperatorProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 服务商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java new file mode 100644 index 0000000..cf749f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java @@ -0,0 +1,61 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 产品开票类目对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("re_product_invoice") +public class ReProductInvoice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java new file mode 100644 index 0000000..d7bb52b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java @@ -0,0 +1,18 @@ +package org.dromara.payment.operator.domain.bo; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; + +import java.util.List; + +/** + * 运营商分配产品业务对象 + */ +@Data +public class AllocOperatorProductBo extends BaseEntity { + + @NotEmpty(message = "产品列表不能为空") + private List products; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java new file mode 100644 index 0000000..e4edf52 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java @@ -0,0 +1,120 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商资金账户业务对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorAccount.class, reverseConvertGenerate = false) +public class BusOperatorAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行虚拟账号 + */ + @NotBlank(message = "银行虚拟账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankVirtualCard; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额(分) + */ + @NotNull(message = "冻结金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 已提现金额(分) + */ + @NotNull(message = "已提现金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashout; + + /** + * 提现中金额(分) + */ + @NotNull(message = "提现中金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java new file mode 100644 index 0000000..18f86c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 运营商协议业务对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorAgreement.class, reverseConvertGenerate = false) +public class BusOperatorAgreementBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @NotNull(message = "协议类型(1:线上 2:线下)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStyle; + + /** + * 协议标题 + */ + @NotBlank(message = "协议标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 协议链接 + */ + @NotBlank(message = "协议链接不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java new file mode 100644 index 0000000..8fe7b07 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java @@ -0,0 +1,239 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商业务对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperator.class, reverseConvertGenerate = false) +public class BusOperatorBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + //@NotBlank(message = "运营商编号(示例:A10049)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + @NotNull(message = "运营商类型(1:企业,:2:个人)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer dwType; + + /** + * 运营商名称 + */ + @NotBlank(message = "运营商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人身份证 + */ + @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户账号 + */ + @NotBlank(message = "开户账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ +// @NotBlank(message = "支付宝登录号(支持邮箱和手机号格式)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 银行卡正面 + */ +// @NotBlank(message = "银行卡正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankZm; + + /** + * 支付密码 + */ + //@NotBlank(message = "支付密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payPassword; + + /** + * 密码输入错误次数 + */ + //@NotNull(message = "密码输入错误次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + //@NotNull(message = "密码冻结结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + //@NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + + private String domain; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java new file mode 100644 index 0000000..e0852a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java @@ -0,0 +1,166 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商提现记录业务对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorCashout.class, reverseConvertGenerate = false) +public class BusOperatorCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + @NotNull(message = "运营商账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + @NotBlank(message = "快递公司(字典值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String iogisticsCompany; + + /** + * 快递单号 + */ + @NotBlank(message = "快递单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String iogisticsNo; + + /** + * 发票图片 + */ + @NotBlank(message = "发票图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java new file mode 100644 index 0000000..b3c190b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java @@ -0,0 +1,206 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商流水业务对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorFlows.class, reverseConvertGenerate = false) +public class BusOperatorFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java new file mode 100644 index 0000000..ccd621d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java @@ -0,0 +1,123 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 运营商产品业务对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorProduct.class, reverseConvertGenerate = false) +public class BusOperatorProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 服务商服务费率(%) + */ + @NotNull(message = "服务商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + @NotNull(message = "运营商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式(1:个人应得计费、2:开票金额计费)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式(1:到卡 2:余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @NotNull(message = "状态(1:上架 2:下架)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer proStatus; + + + private String sydName; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java new file mode 100644 index 0000000..85d07b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 产品开票类目业务对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ReProductInvoice.class, reverseConvertGenerate = false) +public class ReProductInvoiceBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + @NotNull(message = "开票类目id(mer_invoice_type表id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoiceTypeId; + + @NotNull(message = "开票类目名称(mer_invoice_type表type)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceTypeName; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java new file mode 100644 index 0000000..7934b9b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商资金账户Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java new file mode 100644 index 0000000..c64d083 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorAgreementVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商协议Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorAgreementVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java new file mode 100644 index 0000000..146150d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorCashoutVo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商提现记录Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java new file mode 100644 index 0000000..4d48868 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorFlowsVo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商流水Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java new file mode 100644 index 0000000..9f1ed73 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商产品Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java new file mode 100644 index 0000000..5603fbf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java new file mode 100644 index 0000000..ae5bfa8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteReProductInvoiceVo; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 产品开票类目Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface ReProductInvoiceVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java new file mode 100644 index 0000000..8a60da9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java @@ -0,0 +1,173 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商资金账户视图对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorAccount.class) +public class BusOperatorAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行虚拟账号 + */ + @ExcelProperty(value = "银行虚拟账号") + private String bankVirtualCard; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long balance; + + /** + * 冻结金额(分) + */ + @ExcelProperty(value = "冻结金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long frozen; + + /** + * 已提现金额(分) + */ + @ExcelProperty(value = "已提现金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long cashout; + + /** + * 提现中金额(分) + */ + @ExcelProperty(value = "提现中金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + /** + * 附属企业名称 + */ + @ExcelProperty(value = "附属企业名称") + private String sydName; + + /** + * 附属企业编号 + */ + @ExcelProperty(value = "附属企业编号") + private String sydNo; + + + private String opName; + + //虚拟户名 + private String name; + + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java new file mode 100644 index 0000000..c8d223d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java @@ -0,0 +1,94 @@ +package org.dromara.payment.operator.domain.vo; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商协议视图对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorAgreement.class) +public class BusOperatorAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @ExcelProperty(value = "协议类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:线上,2=:线下") + private Integer signStyle; + + /** + * 协议标题 + */ + @ExcelProperty(value = "协议标题") + private String title; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:签约成功,2=:签约失败") + private Integer status; + + /** + * 协议链接 + */ + @ExcelProperty(value = "协议链接") + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java new file mode 100644 index 0000000..025c444 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java @@ -0,0 +1,217 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商提现记录视图对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorCashout.class) +public class BusOperatorCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商账户id + */ + @ExcelProperty(value = "运营商账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 快递公司(字典值) + */ + @ExcelProperty(value = "快递公司", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String iogisticsCompany; + + /** + * 快递单号 + */ + @ExcelProperty(value = "快递单号") + private String iogisticsNo; + + /** + * 发票图片 + */ + @ExcelProperty(value = "发票图片") + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") + private String opName; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 服务商编号 + */ + @ExcelProperty(value = "服务商编号") + private String sydNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java new file mode 100644 index 0000000..73cbdb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java @@ -0,0 +1,249 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商流水视图对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorFlows.class) +public class BusOperatorFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 交易时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道") + private String channel; + + + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + @ExcelProperty(value = "交易金额") + private String moneyStr; + + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + + + + + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java new file mode 100644 index 0000000..d465ce3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java @@ -0,0 +1,147 @@ +package org.dromara.payment.operator.domain.vo; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商产品视图对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorProduct.class) +public class BusOperatorProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + private String sydName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 服务商服务费率(%) + */ + @ExcelProperty(value = "服务商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + @ExcelProperty(value = "运营商服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + @ExcelIgnore + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java new file mode 100644 index 0000000..6616abb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java @@ -0,0 +1,251 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperator; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商视图对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperator.class) +public class BusOperatorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + @ExcelProperty(value = "运营商编号(示例:A10049)") + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + @ExcelProperty(value = "运营商类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:企业,:2:个人") + private Integer dwType; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") + private String name; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户账号 + */ + @ExcelProperty(value = "开户账号") + private String bankCard; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 银行卡正面 + */ + @ExcelProperty(value = "银行卡正面") + private String bankZm; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + + + private Date createTime; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java new file mode 100644 index 0000000..0013bb9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java @@ -0,0 +1,75 @@ +package org.dromara.payment.operator.domain.vo; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 产品开票类目视图对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ReProductInvoice.class) +public class ReProductInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册)") + private Long proType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + @ExcelProperty(value = "开票类目id(mer_invoice_type表id)") + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + @ExcelProperty(value = "业务id(结算中心id或运营商id)") + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "6=:服务商,7=:运营商,8=:代理商,9=:商户,1=1:账单批次") + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java new file mode 100644 index 0000000..caafab5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java @@ -0,0 +1,88 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydAccount; + +import java.util.List; + +/** + * 运营商资金账户Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorAccountMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 新增虚拟银行账号 + * @return 结果 + */ + public int insertAccount(BusOperatorAccount account); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId, @Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已提现金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashoutByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减提现申请金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashoutingByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + /*** + * 查询运营商不同银行的虚拟户 + * @param bo + * @param page + * @return + */ + public List selectOperatorAccountLists(@Param("bo") BusOperatorAccountBo bo,@Param("page") Page page); + + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java new file mode 100644 index 0000000..902a951 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运营商协议Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorAgreementMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java new file mode 100644 index 0000000..486ccfb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 运营商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorCashoutMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java new file mode 100644 index 0000000..1c2ad67 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java @@ -0,0 +1,16 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydFlows; + +/** + * 运营商流水Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorFlowsMapper extends BaseMapperPlus { + public int insertSelective(BusOperatorFlows flow); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java new file mode 100644 index 0000000..2d92a21 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运营商Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java new file mode 100644 index 0000000..1b56499 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java @@ -0,0 +1,60 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 运营商产品Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorProductMapper extends BaseMapperPlus { + /** + * 给运营商分配产品 + * @param bo + * @return + */ + public Integer allocOperatorProduct(AllocOperatorProductBo bo); + + + + + public Integer insertOperatorProduct(AllocOperatorProductBo bo); + /*** + * 根据运营商的信息,查询直接下级代理服务商的最新基本费率 + * @param paraMap + * @return + */ + public List selectChannelProductMin(Map paraMap); + + + /*** + * 更新渠道商的成本费率 + * @param proList + * @return + */ + public Integer updateChannelProCostCharge(List proList); + + + /*** + * 运营商分配产品查询 + * @param page + * @param wrapper + * @param opId + * @return + */ + Page setingOpratorProductList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper,@Param("opId") Long opId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java new file mode 100644 index 0000000..922455e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java @@ -0,0 +1,30 @@ +package org.dromara.payment.operator.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.Date; +import java.util.List; + +/** + * 产品开票类目Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface ReProductInvoiceMapper extends BaseMapperPlus { + /** + * 分配产品开票类目 + * @param proIds 产品id列表 + * @param busIds 引用业务id列表(结算中心id或运营商id) + * @param busType 引用业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param newBusId 接收业务id列表(结算中心id或运营商id) + * @param newBusType 接收业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param operBy 操作人id + * @param operTime 操作时间 + * @return + */ + Integer allocProduct(@Param("proIds") List proIds, @Param("busIds") List busIds, @Param("busType") int busType, @Param("newBusId") Long newBusId, @Param("newBusType") int newBusType, @Param("operBy") Long operBy, @Param("operTime") Date operTime); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java new file mode 100644 index 0000000..8a91394 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java @@ -0,0 +1,96 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.function.Function; + +/** + * 运营商资金账户Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorAccountService { + + + + public List queryListFp(BusOperatorAccountBo bo, PageQuery pageQuery); + + /** + * 查询运营商资金账户 + */ + BusOperatorAccountVo queryById(Long id); + + /** + * 查询运营商资金账户列表 + */ + TableDataInfo queryPageList(BusOperatorAccountBo bo, PageQuery pageQuery); + + /** + * 查询运营商资金账户列表 + */ + List queryList(BusOperatorAccountBo bo); + + /** + * 新增运营商资金账户 + */ + Boolean insertByBo(BusOperatorAccountBo bo); + + /** + * 修改运营商资金账户 + */ + Boolean updateByBo(BusOperatorAccountBo bo); + + /** + * 校验并批量删除运营商资金账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询运营商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusOperatorAccountVo getCashoutAccount(Long id); + + /*** + * 创建运营商虚拟户 + * @param sydId + * @param opId + * @param opName + * @param bankType + * @return + */ + Boolean createXnAccount(Long sydId, Long opId, String opName, String bankType); + + + + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType, String bankType1, Function saveFun, Function existsFun); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java new file mode 100644 index 0000000..2c6b793 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商协议Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorAgreementService { + + /** + * 查询运营商协议 + */ + BusOperatorAgreementVo queryById(Long id); + + /** + * 查询运营商协议列表 + */ + TableDataInfo queryPageList(BusOperatorAgreementBo bo, PageQuery pageQuery); + + /** + * 查询运营商协议列表 + */ + List queryList(BusOperatorAgreementBo bo); + + /** + * 新增运营商协议 + */ + Boolean insertByBo(BusOperatorAgreementBo bo); + + /** + * 修改运营商协议 + */ + Boolean updateByBo(BusOperatorAgreementBo bo); + + /** + * 校验并批量删除运营商协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java new file mode 100644 index 0000000..2243ddf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java @@ -0,0 +1,68 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商提现记录Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorCashoutService { + + /** + * 查询运营商提现记录 + */ + BusOperatorCashoutVo queryById(Long id); + + /** + * 查询运营商提现记录列表 + */ + TableDataInfo queryPageList(BusOperatorCashoutBo bo, PageQuery pageQuery); + + /** + * 查询运营商提现记录列表 + */ + List queryList(BusOperatorCashoutBo bo); + + /** + * 新增运营商提现记录 + */ + Boolean insertByBo(BusOperatorCashoutBo bo); + + /** + * 审批运营商提现记录 + * @param bo + * @return + */ + Boolean verifyCashout(BusOperatorCashoutBo bo); + + /** + * 修改运营商提现记录 + */ + Boolean updateByBo(BusOperatorCashoutBo bo); + + /** + * 校验并批量删除运营商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 运营商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java new file mode 100644 index 0000000..505c4d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商流水Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorFlowsService { + + /** + * 查询运营商流水 + */ + BusOperatorFlowsVo queryById(Long id); + + /** + * 查询运营商流水列表 + */ + TableDataInfo queryPageList(BusOperatorFlowsBo bo, PageQuery pageQuery); + + /** + * 查询运营商流水列表 + */ + List queryList(BusOperatorFlowsBo bo); + + /** + * 新增运营商流水 + */ + Boolean insertByBo(BusOperatorFlowsBo bo); + + /** + * 修改运营商流水 + */ + Boolean updateByBo(BusOperatorFlowsBo bo); + + /** + * 校验并批量删除运营商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java new file mode 100644 index 0000000..e448861 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java @@ -0,0 +1,69 @@ +package org.dromara.payment.operator.service; + +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商产品Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorProductService { + + /** + * 查询运营商产品 + */ + BusOperatorProductVo queryById(Long id); + + /** + * 查询运营商产品列表 + */ + TableDataInfo queryPageList(BusOperatorProductBo bo, PageQuery pageQuery); + + /** + * 查询运营商产品列表 + */ + List queryList(BusOperatorProductBo bo); + + /** + * 新增运营商产品 + */ + Boolean insertByBo(BusOperatorProductBo bo); + + /** + * 修改运营商产品 + */ + Boolean updateByBo(BusOperatorProductBo bo); + + /** + * 校验并批量删除运营商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 给运营商分配产品 + * @param bo + * @return + */ + public boolean allocOperatorProduct(AllocOperatorProductBo bo); + + + + TableDataInfo queryPageListNew(BusOperatorProductBo bo, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java new file mode 100644 index 0000000..02bcbd1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorService { + + /** + * 查询运营商 + */ + BusOperatorVo queryById(Long id); + + /** + * 查询运营商列表 + */ + TableDataInfo queryPageList(BusOperatorBo bo, PageQuery pageQuery); + + /** + * 查询运营商列表 + */ + List queryList(BusOperatorBo bo); + + /** + * 新增运营商 + */ + Boolean insertByBo(BusOperatorBo bo); + + /** + * 修改运营商 + */ + Boolean updateByBo(BusOperatorBo bo); + + /** + * 校验并批量删除运营商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java new file mode 100644 index 0000000..08b3360 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 产品开票类目Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IReProductInvoiceService { + + /** + * 查询产品开票类目 + */ + ReProductInvoiceVo queryById(Long id); + + /** + * 查询产品开票类目列表 + */ + TableDataInfo queryPageList(ReProductInvoiceBo bo, PageQuery pageQuery); + + /** + * 查询产品开票类目列表 + */ + List queryList(ReProductInvoiceBo bo); + + /** + * 新增产品开票类目 + */ + Boolean insertByBo(ReProductInvoiceBo bo); + + /** + * 修改产品开票类目 + */ + Boolean updateByBo(ReProductInvoiceBo bo); + + /** + * 校验并批量删除产品开票类目信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java new file mode 100644 index 0000000..8cef6e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java @@ -0,0 +1,329 @@ +package org.dromara.payment.operator.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.service.impl.BankAccountServiceTransactionImpl; +import org.dromara.payment.sys.service.impl.SysSydServiceTransactionImpl; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.function.Function; + +/** + * 运营商资金账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class BusOperatorAccountServiceImpl extends BaseService implements IBusOperatorAccountService { + + + private final BusOperatorAccountMapper baseMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydServiceTransactionImpl transactionImpl; + + private final BankAccountServiceTransactionImpl bankAccountTransactionImpl; + + /** + * 查询运营商资金账户 + */ + @Override + public BusOperatorAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + + + + @Override + public List queryListFp(BusOperatorAccountBo bo, PageQuery pageQuery){ + if(bo.getOpId() == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + + if(StringUtils.isEmpty(bo.getBankType())){ + this.invalidationParamsException("银行通道不能为空"); + } + return this.baseMapper.selectOperatorAccountLists(bo,pageQuery.build()); + } + + + /** + * 查询运营商资金账户列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorAccountBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper2(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商资金账户列表 + */ + @Override + public List queryList(BusOperatorAccountBo bo) { + QueryWrapper lqw = buildQueryWrapper2(bo); + return baseMapper.queryList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOpId() != null, BusOperatorAccount::getOpId, bo.getOpId()); + lqw.eq(bo.getSydId() != null, BusOperatorAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, BusOperatorAccount::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), BusOperatorAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), BusOperatorAccount::getBankVirtualCard, bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, BusOperatorAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, BusOperatorAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getCashout() != null, BusOperatorAccount::getCashout, bo.getCashout()); + lqw.eq(bo.getCashouting() != null, BusOperatorAccount::getCashouting, bo.getCashouting()); + lqw.eq(bo.getIsDefault() != null, BusOperatorAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, BusOperatorAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getStatus() != null, BusOperatorAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), BusOperatorAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + + private QueryWrapper buildQueryWrapper2(BusOperatorAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), "t.bank_virtual_card", bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, "t.balance", bo.getBalance()); + lqw.eq(bo.getFrozen() != null, "t.frozen", bo.getFrozen()); + lqw.eq(bo.getCashout() != null, "t.cashout", bo.getCashout()); + lqw.eq(bo.getCashouting() != null, "t.cashouting", bo.getCashouting()); + lqw.eq(bo.getIsDefault() != null,"t.is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null,"t.add_time", bo.getAddTime()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), "t.out_bank_card", bo.getOutBankCard()); + return lqw; + } + + /** + * 新增运营商资金账户 + */ + @Override + public Boolean insertByBo(BusOperatorAccountBo bo) { + BusOperatorAccount add = MapstructUtils.convert(bo, BusOperatorAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商资金账户 + */ + @Override + public Boolean updateByBo(BusOperatorAccountBo bo) { + BusOperatorAccount update = MapstructUtils.convert(bo, BusOperatorAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商资金账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusOperatorAccountVo getCashoutAccount(Long id) { + BusOperatorAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusOperatorVo vo = operatorMapper.selectVoById(rtn.getOpId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankVirtualCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } + + @Override + public Boolean createXnAccount(Long sydId, Long opId, String opName, String bankType) { + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + if(opId == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + if(StringUtils.isEmpty(opName)){ + this.invalidationParamsException("运营商名称不能为空"); + } + if(StringUtils.isEmpty(bankType)){ + this.invalidationParamsException("银行类型不能为空"); + } + + QueryWrapper qw = Wrappers.query(); + qw.eq("t.syd_id",sydId); + qw.eq("t.op_id",opId); + qw.eq("t.bank_type",bankType); + qw.eq("t.is_default",1); + List accs = this.baseMapper.queryList(qw); + if(!accs.isEmpty()){ + return true; + } + Boolean sydRtn = creatXNnum(sydId,opId,opName, BusRole.OPERATOR.getId(),BusRole.PLATFORM.getId(),bankType, add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusOperatorAccount(opId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }, bankType1 -> { + QueryWrapper qw1 = Wrappers.query(); + qw1.eq("t.syd_id",sydId); + qw1.eq("t.op_id",opId); + qw1.eq("t.bank_type",bankType); + qw1.eq("t.is_default",1); + List accs1 = this.baseMapper.queryList(qw1); +// List accs = sysSydAccountMapper.selectSysSydAccountBySydId(id.intValue(), (short) 0, bankType1); + return accs1.size() > 0 ? accs1.get(0).getBankVirtualCard() : null; + }); + + return true; + } + + + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType,String bankType1, Function saveFun, Function existsFun) { + String failBank = ""; + try { + if("招商银行".equals(bankType1)){ + try { + transactionImpl.addZhaoShangAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "招商银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("交通银行".equals(bankType1)){ + try { + transactionImpl.addJiaoTongAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun,existsFun); + } catch (Exception e) { + String bankType = "交通银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("支付宝".equals(bankType1)){ + try { + transactionImpl.addZhiFuBaoAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "支付宝"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("民生银行".equals(bankType1)){ + try { + transactionImpl.addMinShengAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "民生银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + } + if (StringUtils.isNotEmpty(failBank)) { + throw new ServiceException("开通账户失败[" + failBank + "]"); + } + return true; + } catch (Exception e) { + String msgStr = "开虚拟户失败!"; + log.error(msgStr, e); + if (e instanceof ServiceException) { + throw new ServiceException(e.getMessage()); + } else { + throw new ServiceException(msgStr); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java new file mode 100644 index 0000000..9234a91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.mapper.BusOperatorAgreementMapper; +import org.dromara.payment.operator.service.IBusOperatorAgreementService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商协议Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorAgreementServiceImpl implements IBusOperatorAgreementService { + + private final BusOperatorAgreementMapper baseMapper; + + /** + * 查询运营商协议 + */ + @Override + public BusOperatorAgreementVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商协议列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorAgreementBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商协议列表 + */ + @Override + public List queryList(BusOperatorAgreementBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorAgreementBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusOperatorAgreement::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusOperatorAgreement::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusOperatorAgreement::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusOperatorAgreement::getOpId, bo.getOpId()); + lqw.eq(bo.getSignStyle() != null, BusOperatorAgreement::getSignStyle, bo.getSignStyle()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), BusOperatorAgreement::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperatorAgreement::getNo, bo.getNo()); + lqw.eq(bo.getStatus() != null, BusOperatorAgreement::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), BusOperatorAgreement::getFileUrl, bo.getFileUrl()); + return lqw; + } + + /** + * 新增运营商协议 + */ + @Override + public Boolean insertByBo(BusOperatorAgreementBo bo) { + BusOperatorAgreement add = MapstructUtils.convert(bo, BusOperatorAgreement.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商协议 + */ + @Override + public Boolean updateByBo(BusOperatorAgreementBo bo) { + BusOperatorAgreement update = MapstructUtils.convert(bo, BusOperatorAgreement.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorAgreement entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java new file mode 100644 index 0000000..0d3d9e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java @@ -0,0 +1,320 @@ +package org.dromara.payment.operator.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.mapper.BusOperatorCashoutMapper; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorCashoutServiceImpl implements IBusOperatorCashoutService { + + private final BusOperatorCashoutMapper baseMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询运营商提现记录 + */ + @Override + public BusOperatorCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorCashoutBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商提现记录列表 + */ + @Override + public List queryList(BusOperatorCashoutBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusOperatorCashoutBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("op_name"))){ + lqw.like("t1.name",bo.getParams().get("op_name")); + } + + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增运营商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusOperatorCashoutBo bo) { + BusOperatorCashout add = MapstructUtils.convert(bo, BusOperatorCashout.class); + validEntityBeforeSave(add); + BusOperatorAccountVo vo = operatorAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + BusOperator operator = operatorMapper.selectOne(new LambdaQueryWrapper().eq(BusOperator::getId,vo.getOpId())); + billService.checkPayPassword(BusRole.OPERATOR, vo.getOpId(), () -> { + if(StringUtils.isBlank(operator.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(operator.getPayPassword()); + }); + String busDesc = "运营商提现"; + if(operatorAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setOpId(vo.getOpId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankVirtualCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+ IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean verifyCashout(BusOperatorCashoutBo bo) { + BusOperatorCashoutVo vo = baseMapper.selectVoById(bo.getId()); + BusOperatorAccountVo boavo = this.operatorAccountService.getCashoutAccount(vo.getAccId()); + if(vo == null){ + throw new ServiceException("提现申请不存在,审核失败"); + } + if(vo.getVerifyStatus() != 0){ + throw new ServiceException("提现申请已审核"); + } + BusOperatorCashout update = MapstructUtils.convert(bo, BusOperatorCashout.class); + update.setVerifyTime(new Date()); + String busDesc = "运营商提现"; + if(update.getVerifyStatus() == 1){//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusOperatorCashout::getId,bo.getId()) + .eq(BusOperatorCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + if(operatorAccountService.updateFrozenByAccId(vo.getAccId().intValue(),-bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户可用余额不足"); + } + }else if(update.getVerifyStatus() == 2){//审批通过 + update.setPayStatus(2l);//支付中 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusOperatorCashout::getId,bo.getId()) + .eq(BusOperatorCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + + Account bankAcc = new Account(); + bankAcc.setBankType(vo.getKhh()); + bankAcc.setBankCard(vo.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(vo.getFr()); + bankAcc.setType((short) 3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //运营商提现 + TranLog backLog = new TranLog(); + backLog.setBusType(4l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(vo.getId()); + Result backRtn = accountService.applyTransfer(boavo.getAccId().intValue(), addRtn.getRtnData().getId(),vo.getAmount(), vo.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.OPERATOR.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.OPERATOR.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + operatorAccountMapper.updateCashoutingByAccId(backRtn.getRtnData().getSourceAccId(),backRtn.getRtnData().getAmount()); + } + return true; + } + + /** + * 修改运营商提现记录 + */ + @Override + public Boolean updateByBo(BusOperatorCashoutBo bo) { + BusOperatorCashout update = MapstructUtils.convert(bo, BusOperatorCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "运营商提现"; + BusOperatorCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(operatorAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(operatorAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusOperatorCashout::getId,vo.getId()) + .eq(BusOperatorCashout::getPayStatus,2) + .set(BusOperatorCashout::getPayStatus,3) + .set(BusOperatorCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + operatorAccountMapper.updateCashoutByAccId(tran.getSourceAccId(),tran.getAmount()); + BusOperatorVo op = operatorMapper.selectVoById(vo.getOpId()); + BusOperatorFlows flow = new BusOperatorFlows(2,vo.getOpId(),16,vo.getPassage(),null,tran.getTargetBankNo(),-tran.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,tlog.getTranNo(),3,tran.getResult().intValue(), tlog.getSourceAccType(), vo.getSydId(),op.getName(),tran.getSourceCard(), tran.getSourceAccId().longValue(),tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(),"",1); + operatorFlowsMapper.insertSelective(flow); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusOperatorCashout::getId,vo.getId()) + .eq(BusOperatorCashout::getPayStatus,2) + .set(BusOperatorCashout::getPayStatus,4) + .set(BusOperatorCashout::getPayTime,new Date()) + .set(BusOperatorCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java new file mode 100644 index 0000000..e42c618 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java @@ -0,0 +1,140 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.service.IBusOperatorFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商流水Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorFlowsServiceImpl implements IBusOperatorFlowsService { + + private final BusOperatorFlowsMapper baseMapper; + + /** + * 查询运营商流水 + */ + @Override + public BusOperatorFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商流水列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorFlowsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商流水列表 + */ + @Override + public List queryList(BusOperatorFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOpId() != null, BusOperatorFlows::getOpId, bo.getOpId()); + lqw.eq(bo.getBusType() != null, BusOperatorFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), BusOperatorFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusOperatorFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), BusOperatorFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, BusOperatorFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusOperatorFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusOperatorFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusOperatorFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusOperatorFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusOperatorFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusOperatorFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusOperatorFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), BusOperatorFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, BusOperatorFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, BusOperatorFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, BusOperatorFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusOperatorFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusOperatorFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusOperatorFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusOperatorFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusOperatorFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusOperatorFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusOperatorFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusOperatorFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusOperatorFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusOperatorFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, BusOperatorFlows::getPayReceiptType, bo.getPayReceiptType()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(BusOperatorFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + lqw.orderByDesc(BusOperatorFlows::getId); + return lqw; + } + + /** + * 新增运营商流水 + */ + @Override + public Boolean insertByBo(BusOperatorFlowsBo bo) { + BusOperatorFlows add = MapstructUtils.convert(bo, BusOperatorFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商流水 + */ + @Override + public Boolean updateByBo(BusOperatorFlowsBo bo) { + BusOperatorFlows update = MapstructUtils.convert(bo, BusOperatorFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java new file mode 100644 index 0000000..5a2c671 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java @@ -0,0 +1,242 @@ +package org.dromara.payment.operator.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.mapper.BusOperatorProductMapper; +import org.dromara.payment.operator.service.IBusOperatorProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 运营商产品Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorProductServiceImpl extends BaseService implements IBusOperatorProductService { + + private final BusOperatorProductMapper baseMapper; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + private final StreamBridge streamBridge; + /** + * 查询运营商产品 + */ + @Override + public BusOperatorProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商产品列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorProductBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商产品列表 + */ + @Override + public List queryList(BusOperatorProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusOperatorProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusOperatorProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusOperatorProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusOperatorProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusOperatorProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusOperatorProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusOperatorProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusOperatorProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusOperatorProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChargeMode() != null, BusOperatorProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusOperatorProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusOperatorProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusOperatorProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusOperatorProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusOperatorProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增运营商产品 + */ + @Override + public Boolean insertByBo(BusOperatorProductBo bo) { + BusOperatorProduct add = MapstructUtils.convert(bo, BusOperatorProduct.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商产品 + */ + @Override + public Boolean updateByBo(BusOperatorProductBo bo) { + BusOperatorProduct update = MapstructUtils.convert(bo, BusOperatorProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean allocOperatorProduct(AllocOperatorProductBo bo) { + bo.setCreateTime(new Date()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + + Long opId = bo.getProducts().get(0).getOpId(); + String opNo = bo.getProducts().get(0).getOpNo(); + if(opId == null){ + this.invalidationParamsException("运营商ID[opId]不能为空"); + } + if(StringUtils.isEmpty(opNo)){ + this.invalidationParamsException("运营商编码[opNo]不能为空"); + } + + Long busType = bo.getProducts().get(0).getBusType(); + List proIds = StreamUtils.toList(bo.getProducts(), RemoteBusOperatorProductVo::getProId); + lqw.eq(BusOperatorProduct::getOpId,opId); + lqw.in(BusOperatorProduct::getProId,proIds); + + + Map selOperPros = new HashMap(); + Map paraMap = new HashMap(); + paraMap.put("busType",busType); + paraMap.put("opId",opId); + + List busProList = this.baseMapper.selectChannelProductMin(paraMap); + + //查询已经分配的产品费率 + if(busProList != null && !busProList.isEmpty()){ + for(BusChannelProduct bopd: busProList){ + selOperPros.put(bopd.getProNo(),bopd); + } + } + + //验证产品费率 + List remoteBusProList = bo.getProducts(); + + List updateList = new ArrayList(); + + for(RemoteBusOperatorProductVo opv : remoteBusProList){ + opv.setCreateTime(new Date()); + opv.setCreateBy(LoginHelper.getUserId()); +// opv.setCostServiceCharge(opv.getServiceCharge()); + if(opv.getServiceCharge() != null ){ + +// opv.setServiceCharge(opv.getServiceCharge()); + if(opv.getServiceCharge().compareTo(opv.getCostServiceCharge()) < 0){ + this.invalidationParamsException("产品编号["+opv.getProNo() + "]的配置服务费率不能小于成本费率"); + } + BusChannelProduct bopd = (BusChannelProduct)selOperPros.get(opv.getProNo()); + if(bopd != null && bopd.getServiceCharge() != null){ + if(bopd.getServiceCharge() != null){ + if(opv.getServiceCharge().compareTo(bopd.getServiceCharge()) > 0){ + this.invalidationParamsException("产品编号["+opv.getProNo() + "]的配置服务费率不能大于成本费率["+bopd.getServiceCharge()+"]"); + }else{ + if(opv.getProStatus() == 1){ + Map upMap = new HashMap(); + upMap.put("cost_service_charge",opv.getServiceCharge()); + upMap.put("op_id",opId); + upMap.put("pro_id",opv.getProId()); + updateList.add(upMap); + } + } + } + } + } + } + baseMapper.delete(lqw); +// baseMapper.allocOperatorProduct(bo); + baseMapper.insertOperatorProduct(bo); + if(!updateList.isEmpty()){ + this.baseMapper.updateChannelProCostCharge(updateList); + } + reProductInvoiceMapper.delete(new LambdaQueryWrapper().eq(ReProductInvoice::getBusId,opId).eq(ReProductInvoice::getBusType,BusRole.OPERATOR.getId())); + List sydIds = bo.getProducts().stream().map(RemoteBusOperatorProductVo::getSydId).distinct().collect(Collectors.toList()); + reProductInvoiceMapper.allocProduct(proIds,sydIds, BusRole.SERVICE.getId(),opId,BusRole.OPERATOR.getId(),bo.getCreateBy(),new Date()); + JSONObject queueParam = new JSONObject(); + queueParam.put("accType", BusRole.OPERATOR.getId()); + queueParam.put("addAccType", BusRole.PLATFORM.getId()); + queueParam.put("accUnitId", opId); + queueParam.put("sydIds",sydIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + streamBridge.send("account-out-0", MessageBuilder.withPayload(queueParam).build()); + return true; + } + + @Override + public TableDataInfo queryPageListNew(BusOperatorProductBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + lqw.like(StringUtils.isNotEmpty(bo.getSydName()),"t2.gsmc",bo.getSydName()); + lqw.eq("t.bus_type",bo.getBusType()); + lqw.isNotNull("t2.id"); + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.setingOpratorProductList(pageQuery.build(), lqw,bo.getOpId()); + return TableDataInfo.build(result); + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java new file mode 100644 index 0000000..878daf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java @@ -0,0 +1,247 @@ +package org.dromara.payment.operator.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.mapper.SysUnitMapper; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 运营商Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorServiceImpl implements IBusOperatorService { + + private final BusOperatorMapper baseMapper; + + private final SysUnitMapper sysUnitMapper; + + @DubboReference + private RemoteUserService remoteUserService; + + + @DubboReference + private RemoteSmsService remoteSmsService; + + /** + * 查询运营商 + */ + @Override + public BusOperatorVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商列表 + */ + @Override + public List queryList(BusOperatorBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperator::getNo, bo.getNo()); + lqw.eq(bo.getDwType() != null, BusOperator::getDwType, bo.getDwType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusOperator::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusOperator::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusOperator::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusOperator::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusOperator::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusOperator::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusOperator::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusOperator::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusOperator::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusOperator::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusOperator::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusOperator::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusOperator::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusOperator::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusOperator::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusOperator::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusOperator::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), BusOperator::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusOperator::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusOperator::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankZm()), BusOperator::getBankZm, bo.getBankZm()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), BusOperator::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, BusOperator::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, BusOperator::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.eq(bo.getStatus() != null, BusOperator::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), BusOperator::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), BusOperator::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), BusOperator::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), BusOperator::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), BusOperator::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), BusOperator::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.orderByDesc(BusOperator::getCreateTime); + return lqw; + } + + /** + * 新增运营商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusOperatorBo bo) { + BusOperator add = MapstructUtils.convert(bo, BusOperator.class); + validEntityBeforeSave(add); + String no = genNo(0,10); + SysUnit sysUnit = new SysUnit(); + sysUnit.setId(IdUtil.getSnowflakeNextId()); + sysUnit.setNo(no); + sysUnit.setUnitType(BusRole.OPERATOR.getId()); + sysUnit.setName(add.getName()); + sysUnit.setCustNo(no.substring(1)); + sysUnitMapper.insert(sysUnit); + add.setId(sysUnit.getId()); + add.setNo(no); + add.setCreateBy(bo.getCreateBy()); + add.setCreateTime(new Date()); + add.setUpdateBy(bo.getCreateBy()); + add.setUpdateTime(bo.getCreateTime()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(bo.getId()); + remoteUserBo.setBusNo(add.getNo()); + remoteUserBo.setRoleId(BusRole.OPERATOR.getId()); + remoteUserBo.setRoleName(BusRole.OPERATOR.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bo.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bo.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("A"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addUser(remoteUserBo); + + + + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.OPERATOR.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(bo.getDomain(),remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + return flag; + } + + private void addUser(RemoteUserBo remoteUserBo) { + + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("A"+StringUtils.randmNumber(5)); + this.addUser(remoteUserBo); + } + } + + /** + * 生成运营商编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "A"+ RandomUtil.randomNumbers(5); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperator::getNo,no); + BusOperator exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("运营商编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改运营商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(BusOperatorBo bo) { + BusOperator update = MapstructUtils.convert(bo, BusOperator.class); + validEntityBeforeSave(update); + update.setUpdateBy(bo.getUpdateBy()); + update.setUpdateTime(new Date()); + sysUnitMapper.update(new LambdaUpdateWrapper() + .set(SysUnit::getName, update.getName()) + .eq(SysUnit::getId, update.getId())); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperator entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperator::getName,entity.getName()); + BusOperator exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || entity.getId() != exists.getId())){ + throw new ServiceException("运营商已存在"); + } + } + + /** + * 批量删除运营商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + sysUnitMapper.deleteBatchIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java new file mode 100644 index 0000000..223c571 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java @@ -0,0 +1,114 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.operator.service.IReProductInvoiceService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 产品开票类目Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class ReProductInvoiceServiceImpl implements IReProductInvoiceService { + + private final ReProductInvoiceMapper baseMapper; + + /** + * 查询产品开票类目 + */ + @Override + public ReProductInvoiceVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询产品开票类目列表 + */ + @Override + public TableDataInfo queryPageList(ReProductInvoiceBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询产品开票类目列表 + */ + @Override + public List queryList(ReProductInvoiceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ReProductInvoiceBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getProType() != null, ReProductInvoice::getProType, bo.getProType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), ReProductInvoice::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, ReProductInvoice::getProId, bo.getProId()); + lqw.eq(bo.getInvoiceTypeId() != null, ReProductInvoice::getInvoiceTypeId, bo.getInvoiceTypeId()); + lqw.eq(bo.getBusId() != null, ReProductInvoice::getBusId, bo.getBusId()); + lqw.eq(bo.getBusType() != null, ReProductInvoice::getBusType, bo.getBusType()); + return lqw; + } + + /** + * 新增产品开票类目 + */ + @Override + public Boolean insertByBo(ReProductInvoiceBo bo) { + ReProductInvoice add = MapstructUtils.convert(bo, ReProductInvoice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改产品开票类目 + */ + @Override + public Boolean updateByBo(ReProductInvoiceBo bo) { + ReProductInvoice update = MapstructUtils.convert(bo, ReProductInvoice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ReProductInvoice entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除产品开票类目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java new file mode 100644 index 0000000..f157b49 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java @@ -0,0 +1,29 @@ +package org.dromara.payment.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 支付密码配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "pay.password") +public class PayPasswordProperties { + + /** + * 密码最大错误次数 + */ + private Integer maxRetryCount; + + /** + * 密码锁定时间(默认10分钟) + */ + private Integer lockTime; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java new file mode 100644 index 0000000..31ee016 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java @@ -0,0 +1,45 @@ +package org.dromara.payment.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 平台账户配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "pay.platform") +public class PlatformProperties { + + /** + * 开户名(例:上海沪歆商务服务有限公司) + */ + private String khm; + + /** + * 开户账号(例:121919712610506) + */ + private String bankCard; + + /** + * 开户支行(例:上海源深支行) + */ + private String khd; + + /** + * 开户行(例:招商银行) + */ + private String khh; + + /** + * 开户行行号/银联号(例:308290003441) + */ + private String khhNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java new file mode 100644 index 0000000..1bd823f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.service.IAccAccountsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 线下银行账户 + * 前端访问路由地址为:/payment/accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +//@RequestMapping("/accounts") +public class AccAccountsController extends BaseController { + + private final IAccAccountsService accAccountsService; + + /** + * 查询线下银行账户列表 + */ + @SaCheckPermission("payment:accounts:list") + @GetMapping("/list") + public TableDataInfo list(AccAccountsBo bo, PageQuery pageQuery) { + return accAccountsService.queryPageList(bo, pageQuery); + } + + /** + * 导出线下银行账户列表 + */ + @SaCheckPermission("payment:accounts:export") + @Log(title = "线下银行账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(AccAccountsBo bo, HttpServletResponse response) { + List list = accAccountsService.queryList(bo); + ExcelUtil.exportExcel(list, "线下银行账户", AccAccountsVo.class, response); + } + + /** + * 获取线下银行账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:accounts:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(accAccountsService.queryById(id)); + } + + /** + * 新增线下银行账户 + */ + @SaCheckPermission("payment:accounts:add") + @Log(title = "线下银行账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody AccAccountsBo bo) { + return toAjax(accAccountsService.insertByBo(bo)); + } + + /** + * 修改线下银行账户 + */ + @SaCheckPermission("payment:accounts:edit") + @Log(title = "线下银行账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody AccAccountsBo bo) { + return toAjax(accAccountsService.updateByBo(bo)); + } + + /** + * 删除线下银行账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:accounts:remove") + @Log(title = "线下银行账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(accAccountsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java new file mode 100644 index 0000000..f18da3f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.payment.sys.service.IBusDownloadsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 异步下载 + * 前端访问路由地址为:/sys/downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/downloads") +public class BusDownloadsController extends BaseController { + + private final IBusDownloadsService busDownloadsService; + + /** + * 查询异步下载列表 + */ +// @SaCheckPermission("sys:downloads:list") + @GetMapping("/list") + public TableDataInfo list(BusDownloadsBo bo, PageQuery pageQuery) { + return busDownloadsService.queryPageList(bo, pageQuery); + } + + /** + * 导出异步下载列表 + */ + @SaCheckPermission("sys:downloads:export") + @Log(title = "异步下载", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusDownloadsBo bo, HttpServletResponse response) { + List list = busDownloadsService.queryList(bo); + ExcelUtil.exportExcel(list, "异步下载", BusDownloadsVo.class, response); + } + + /** + * 获取异步下载详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sys:downloads:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busDownloadsService.queryById(id)); + } + + /** + * 新增异步下载 + */ + @SaCheckPermission("sys:downloads:add") + @Log(title = "异步下载", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusDownloadsBo bo) { + return toAjax(busDownloadsService.insertByBo(bo)); + } + + /** + * 修改异步下载 + */ + @SaCheckPermission("sys:downloads:edit") + @Log(title = "异步下载", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusDownloadsBo bo) { + return toAjax(busDownloadsService.updateByBo(bo)); + } + + /** + * 删除异步下载 + * + * @param ids 主键串 + */ +// @SaCheckPermission("sys:downloads:remove") + @Log(title = "异步下载", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busDownloadsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java new file mode 100644 index 0000000..752fef0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java @@ -0,0 +1,53 @@ +//package org.dromara.payment.sys.controller; +// +// +//import org.dromara.common.log.enums.BusinessType; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//@RestController +//@RequestMapping({"/business/early_warn"}) +//public class LgEarlyWarnController extends BaseController { +// @Autowired +// private ILgEarlyWarnService lgEarlyWarnService; +// +// @ApiOperation(value = "后台-查询风控预警设置列表", response = LgEarlyWarnListDtlVO.class) +// @PreAuthorize("@ss.hasPermi('business:early_warn:list')") +// @GetMapping({"/list"}) +// public TableDataInfo list(LgEarlyWarnListQuery query) { +// YFListVO list = this.lgEarlyWarnService.selectLgEarlyWarnList(query); +// return getDataTable(list.getList(), list.getTotal().longValue()); +// } +// +// @ApiOperation(value = "后台-获取风控预警设置详细信息", response = LgEarlyWarnInfoVO.class) +// @PreAuthorize("@ss.hasPermi('business:early_warn:query')") +// @GetMapping({"/getInfo/{id}"}) +// public AjaxResult getInfo(@PathVariable("id") Integer id) { +// return AjaxResult.success(this.lgEarlyWarnService.selectLgEarlyWarnById(id)); +// } +// +// @ApiOperation("后台-新增风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:add')") +// @Log(title = "后台-风控预警设置", businessType = BusinessType.INSERT) +// @PostMapping({"/add"}) +// public AjaxResult add(@RequestBody LgEarlyWarnSaveDTO dto) { +// this.lgEarlyWarnService.insertLgEarlyWarn(dto); +// return AjaxResult.success(); +// } +// +// @ApiOperation("后台-修改风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:edit')") +// @Log(title = "后台-风控预警设置", businessType = BusinessType.UPDATE) +// @PutMapping({"/edit"}) +// public AjaxResult edit(@RequestBody LgEarlyWarnUpdateDTO lgEarlyWarn) { +// return toAjax(this.lgEarlyWarnService.updateLgEarlyWarn(lgEarlyWarn)); +// } +// +// @ApiOperation("删除风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:remove')") +// @Log(title = "风控预警设置", businessType = BusinessType.DELETE) +// @DeleteMapping({"/remove/{ids}"}) +// public AjaxResult remove(@PathVariable Long[] ids) { +// return toAjax(this.lgEarlyWarnService.deleteLgEarlyWarnByIds(ids)); +// } +//} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java new file mode 100644 index 0000000..1a8bbbe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java @@ -0,0 +1,16 @@ +//package org.dromara.payment.sys.controller; +// +//import com.ruoyi.business.service.ILgEarlyWarnDtlService; +//import com.ruoyi.common.core.controller.BaseController; +//import io.swagger.annotations.Api; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping({"/business/early_warn_dtl"}) +//@Api(tags = {"风控预警设置明细"}) +//public class LgEarlyWarnDtlController extends BaseController { +// @Autowired +// private ILgEarlyWarnDtlService lgEarlyWarnDtlService; +//} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java new file mode 100644 index 0000000..1cdd04f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java @@ -0,0 +1,130 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.IProInfoCommonService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonController + * @description + * @create 2024-04-24 17:42 + */ + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/proInfo") +public class ProInfoCommonController extends BaseController { + + + @Resource + private IProInfoCommonService commonService; + + + /** + * 查询不同角色-产品列表 + */ +// @SaCheckPermission("payment:proInfo:list") + @GetMapping("/list") + @Log(title = "查询不同角色-产品列表", businessType = BusinessType.OTHER) + public TableDataInfo list(ProInfoCommonBo bo, PageQuery pageQuery) { + return commonService.queryPageList(bo, pageQuery); + } + + /** + * 查询不同角色-企业列表 + */ +// @SaCheckPermission("payment:proInfo:list") + @GetMapping("/listMer") + @Log(title = "查询不同角色-企业列表", businessType = BusinessType.OTHER) + public R> listMer(ProInfoCommonBo bo) { + return R.ok(commonService.selectMerchantList(bo)); + } + + + + + + @GetMapping("/listServ") + @Log(title = "根据企业查询对应的服务商", businessType = BusinessType.OTHER) + public R> selServiceInfoByMerInfo(BusMerchantVo merchantVo){ + return R.ok(commonService.selectServiceInfoByMerInfo(merchantVo)); + } + + + + /*** + * 查询不同角色的业务类型 + * @return + */ + @GetMapping("/selBusType") + @Log(title = "查询不同角色的业务类型", businessType = BusinessType.OTHER) + public R> selDifRoleBusType(){ + return R.ok(commonService.selDifRoleBusType()); + } + + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:46 + * 说明:给企业分配产品,对应的服务商查询,过滤已经分配过的服务商 + **/ + @GetMapping("/selAgentService") + @Log(title = "给企业分配产品,对应的服务商查询,过滤已经分配过的服务商", businessType = BusinessType.OTHER) + public R> selectAgentService(ProInfoCommonBo commonBo){ + return R.ok(commonService.selectAgentService(commonBo)); + + } + + + + @GetMapping("/selBtByMs") + @Log(title = "根据企业,服务商信息查询对应的业务类型", businessType = BusinessType.OTHER) + public R> selectBusTypeByMerSerInfo(Long merId, Long sydId){ + return R.ok(commonService.selectBusTypeByMerSerInfo(merId,sydId)); + } + + + + @GetMapping("/selBtByMsName") + @Log(title = "根据企业,服务商信息查询对应的业务类型", businessType = BusinessType.OTHER) + public R> selectBusTypeByMerSerInfoName(Long merId, Long sydId){ + if(merId == null && sydId == null){ + return R.ok(new ArrayList<>()); + } + return R.ok(commonService.selectBusTypeByMerSerInfoName(merId,sydId)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java new file mode 100644 index 0000000..7459047 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java @@ -0,0 +1,58 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; +import org.dromara.payment.sys.service.ISysPayPwdService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdController + * @description + * @create 2024-05-13 11:28 + */ +@RestController +@RequestMapping("/sys/") +public class SysPayPwdController extends BaseController { + + @Resource + public ISysPayPwdService sysPayPwdService; + + + /**** + * 修改支付密码 + * @param bo + * @return + */ + + @ApiEncrypt + @SaCheckPermission("payment:sys:updPayPwd") + @PutMapping("/updPayPwd") + @Log(title = "修改支付密码", businessType = BusinessType.UPDATE) + public R updPayPwd(@Validated @RequestBody SysPayPwdBo bo){ + return R.ok(sysPayPwdService.updPayPwd(bo)); + } + + + /**** + * 发送支付密码短信 + * @param domain + * @return + */ + @GetMapping("/sendPayPwd") + @Log(title = "发送修改支付密码短信", businessType = BusinessType.UPDATE) + public R sendPaySms(String domain){ + return R.ok(this.sysPayPwdService.sendSmsCode(domain)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java new file mode 100644 index 0000000..fc75286 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java @@ -0,0 +1,134 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商账户 + * 前端访问路由地址为:/payment/sydAccount + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydAccount") +public class SysSydAccountController extends BaseController { + + private final ISysSydAccountService sysSydAccountService; + + private final ISysSydService sysSydService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询服务商账户列表 + */ + //@SaCheckPermission("payment:sydAccount:list") + @GetMapping("/list") + public TableDataInfo list(SysSydAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + TableDataInfo rtn = sysSydAccountService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0){ + SysSydVo vo = sysSydService.queryById(loginUser.getBusId()); + rtn.setRows(rtn.getRows().stream().peek(d -> d.setAccName(vo.getGsmc())).collect(Collectors.toList())); + } + return rtn; + } + + /** + * 导出服务商账户列表 + */ + @SaCheckPermission("payment:sydAccount:export") + @Log(title = "服务商账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydAccountBo bo, HttpServletResponse response) { + List list = sysSydAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商账户", SysSydAccountVo.class, response); + } + + /** + * 获取服务商账户详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:sydAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + LoginUser loginUser = LoginHelper.getLoginUser(); + SysSydVo vo = sysSydService.queryById(loginUser.getBusId()); + SysSydAccountVo sydAccountVo = sysSydAccountService.queryById(id); + sydAccountVo.setAccName(vo.getGsmc()); + return R.ok(sydAccountVo); + } + + /** + * 新增服务商账户 + */ + @SaCheckPermission("payment:sydAccount:add") + @Log(title = "服务商账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydAccountBo bo) { + return toAjax(sysSydAccountService.insertByBo(bo)); + } + + /** + * 修改服务商账户 + */ + @SaCheckPermission("payment:sydAccount:edit") + @Log(title = "服务商账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydAccountBo bo) { + return toAjax(sysSydAccountService.updateByBo(bo)); + } + + /** + * 删除服务商账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydAccount:remove") + @Log(title = "服务商账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydAccountService.deleteWithValidByIds(List.of(ids), true)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java new file mode 100644 index 0000000..3a545df --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.service.ISysSydAccountSynService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商账户同步 + * 前端访问路由地址为:/payment/sydAccountSyn + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydAccountSyn") +public class SysSydAccountSynController extends BaseController { + + private final ISysSydAccountSynService sysSydAccountSynService; + + /** + * 查询服务商账户同步列表 + */ + @SaCheckPermission("payment:sydAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(SysSydAccountSynBo bo, PageQuery pageQuery) { + return sysSydAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商账户同步列表 + */ + @SaCheckPermission("payment:sydAccountSyn:export") + @Log(title = "服务商账户同步", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydAccountSynBo bo, HttpServletResponse response) { + List list = sysSydAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商账户同步", SysSydAccountSynVo.class, response); + } + + /** + * 获取服务商账户同步详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydAccountSynService.queryById(id)); + } + + /** + * 新增服务商账户同步 + */ + @SaCheckPermission("payment:sydAccountSyn:add") + @Log(title = "服务商账户同步", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydAccountSynBo bo) { + return toAjax(sysSydAccountSynService.insertByBo(bo)); + } + + /** + * 修改服务商账户同步 + */ + @SaCheckPermission("payment:sydAccountSyn:edit") + @Log(title = "服务商账户同步", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydAccountSynBo bo) { + return toAjax(sysSydAccountSynService.updateByBo(bo)); + } + + /** + * 删除服务商账户同步 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydAccountSyn:remove") + @Log(title = "服务商账户同步", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java new file mode 100644 index 0000000..7022cb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java @@ -0,0 +1,130 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商提现记录 + * 前端访问路由地址为:/payment/sydCashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydCashout") +public class SysSydCashoutController extends BaseController { + + private final ISysSydCashoutService sysSydCashoutService; + + private final ISysSydAccountService sysSydAccountService; + + private final ISysSydService sysSydService; + + /** + * 查询服务商提现记录列表 + */ + @SaCheckPermission("payment:sydCashout:list") + @GetMapping("/list") + public TableDataInfo list(SysSydCashoutBo bo, PageQuery pageQuery) { + return sysSydCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商提现记录列表 + */ + @SaCheckPermission("payment:sydCashout:export") + @Log(title = "服务商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydCashoutBo bo, HttpServletResponse response) { + List list = sysSydCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商提现记录", SysSydCashoutVo.class, response); + } + + /** + * 获取服务商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydCashoutService.queryById(id)); + } + + /** + * 获取服务商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(sysSydAccountService.getCashoutAccount(id)); + } + + /** + * 新增服务商提现记录 + */ + //@SaCheckPermission("payment:sydCashout:add") + @Log(title = "服务商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + bo.setAddBy(loginUser.getNickname()); + return toAjax(sysSydCashoutService.insertByBo(bo)); + } + + /** + * 修改服务商提现记录 + */ + @SaCheckPermission("payment:sydCashout:edit") + @Log(title = "服务商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydCashoutBo bo) { + return toAjax(sysSydCashoutService.updateByBo(bo)); + } + + /** + * 删除服务商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydCashout:remove") + @Log(title = "服务商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java new file mode 100644 index 0000000..5a6db6f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java @@ -0,0 +1,175 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.payment.sys.service.ISysSydConfigService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商配置 + * 前端访问路由地址为:/payment/sydConfig + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydConfig") +public class SysSydConfigController extends BaseController { + + private final ISysSydConfigService sysSydConfigService; + + @DubboReference + private RemoteConfigService configService; + + /** + * 查询服务商配置列表 + */ + @SaCheckPermission("payment:sydConfig:list") + @GetMapping("/list") + public TableDataInfo list(SysSydConfigBo bo, PageQuery pageQuery) { + return sysSydConfigService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商配置列表 + */ + @SaCheckPermission("payment:sydConfig:export") + @Log(title = "服务商配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydConfigBo bo, HttpServletResponse response) { + List list = sysSydConfigService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商配置", SysSydConfigVo.class, response); + } + + /** + * 获取服务商配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydConfig:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydConfigService.queryById(id)); + } + + /** + * 新增服务商配置 + */ + @SaCheckPermission("payment:sydConfig:add") + @Log(title = "服务商配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydConfigBo bo) { + return toAjax(sysSydConfigService.insertByBo(bo)); + } + + /** + * 修改服务商配置 + */ + @SaCheckPermission("payment:sydConfig:edit") + @Log(title = "服务商配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydConfigBo bo) { + return toAjax(sysSydConfigService.updateByBo(bo)); + } + + /** + * 删除服务商配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydConfig:remove") + @Log(title = "服务商配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydConfigService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取配置大类下面的组信息 + * @param unit_id 服务商id + * @param class_alias 固定值(settlement.type) + * @return + */ + @GetMapping(value = "/getConfGroupByUnit/{unit_id}/{class_alias}") + public R> getConfGroupByUnit(@PathVariable(value = "unit_id", required = true) Long unit_id,@PathVariable(value = "class_alias", required = true) String class_alias) + { + Result> result = configService.getConfGroupByUnit(unit_id,class_alias); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + return R.ok(result.getRtnData()); + } + return R.fail("获取配置组失败"); + } + + /** + * 根据配置组查询配置项明细 + * @param unit_id 服务商id + * @param conf_group 配置组名称 + * @return + */ + @GetMapping(value = "/getConfDetailByUnit/{unit_id}/{conf_group}") + public R> getConfDetailByUnit(@PathVariable(value = "unit_id", required = true) Long unit_id,@PathVariable(value = "conf_group", required = true) String conf_group) + { + Result> result = configService.getConfDetailByUnit(unit_id,conf_group); + if(result.getRtnCode()== ResultCodeEnum.SUCCESS.Code()) { + return R.ok(result.getRtnData()); + } + return R.fail("获取配置项明细失败"); + } + + + /** + * 编辑配置项明细 + * @param map + * @return + */ + @PostMapping(value = "/editConfDetail") + public R editConfDetail(@RequestBody Map map) + { + String confs = map.get("confs").toString(); + try { + List lendReco = JSONObject.parseArray(confs, UnitConfDetail.class); + Result result = configService.editConfDetail(lendReco); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + if(result.getRtnData()) { + return R.ok("保存成功"); + } + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return R.fail("保存失败"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java new file mode 100644 index 0000000..8c9232e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java @@ -0,0 +1,187 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商 + * 前端访问路由地址为:/payment/syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/syd") +public class SysSydController extends BaseController { + + private final ISysSydService sysSydService; + + /** + * 查询服务商列表 + */ + @SaCheckPermission("payment:syd:list") + @GetMapping("/list") + public TableDataInfo list(SysSydBo bo, PageQuery pageQuery) { + return sysSydService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商列表 + */ + @SaCheckPermission("payment:syd:export") + @Log(title = "服务商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydBo bo, HttpServletResponse response) { + List list = sysSydService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商", SysSydVo.class, response); + } + + /** + * 获取服务商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:syd:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydService.queryById(id)); + } + + /** + * 新增服务商 + */ + @SaCheckPermission("payment:syd:add") + @Log(title = "服务商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydBo bo) throws Exception { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(sysSydService.insertByBo(bo)); + } + + /** + * 修改服务商 + */ + @SaCheckPermission("payment:syd:edit") + @Log(title = "服务商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setEditer(loginUser.getNickname()); + return toAjax(sysSydService.updateByBo(bo)); + } + + /** + * 删除服务商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:syd:remove") + @Log(title = "服务商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydService.deleteWithValidByIds(List.of(ids), true)); + } + + @Log(title = "开通虚拟户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/creatXNnum") + public R creatXNnum(@NotNull(message = "服务商id不能为空") Long id,@NotEmpty(message = "服务商名称不能为空") String gsmc) { + return toAjax(sysSydService.creatSydXNnum(id,gsmc)); + } + + /** + * 验证是否配置结算中心 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/valiConfig") + public R valiConfig(@NotNull(message = "服务商id") Long sydId,@NotEmpty(message = "结算通道") String passage) { + return R.ok(sysSydService.valiConfig(sydId,passage)!=null); + } + + /** + * 获取结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/getWorkerSignInfo") + public R getWorkerSignInfo(@NotEmpty(message = "服务商id") int sydId) { + return R.ok(sysSydService.getWorkerSignInfo(sydId)); + } + + /** + * 保存结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @return + */ + @Log(title = "保存结算中心的签约信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/saveWorkerSignInfo") + public R saveWorkerSignInfo(@Validated(EditGroup.class) @RequestBody SysSydSignContent sign) { + return toAjax(sysSydService.saveWorkerSignInfo(sign)); + } + + /** + * 获取结算中心的支付宝签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/getSignInfo") + public R getSignInfo(@NotNull(message = "服务商id") Long sydId, @NotEmpty(message = "结算通道") String passage) { + return R.ok(sysSydService.getSignInfo(sydId,passage)); + } + + + + @GetMapping("/getInvInfo") + @Log(title = "获取服务商的开票信息", businessType = BusinessType.SELECT) + public R getSydInvInfo(Long sydId){ + SysSydVo resultVo = new SysSydVo(); + SysSydVo sydVo = this.sysSydService.queryById(sydId); + resultVo.setGsmc(sydVo.getGsmc()); + resultVo.setBankCard(sydVo.getBankCard()); + resultVo.setAddress(sydVo.getAddress()); + resultVo.setNsrSbh(sydVo.getNsrSbh()); + resultVo.setKfh(sydVo.getKfh()); + resultVo.setConPhone(sydVo.getConPhone()); + return R.ok(resultVo); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java new file mode 100644 index 0000000..902f9ca --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java @@ -0,0 +1,156 @@ +package org.dromara.payment.sys.controller; + +import java.io.IOException; +import java.util.*; + +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.service.ISysSydFlowsService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商流水 + * 前端访问路由地址为:/payment/sydFlows + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydFlows") +public class SysSydFlowsController extends BaseController { + + private final ISysSydFlowsService sysSydFlowsService; + + /** + * 查询服务商流水列表 + */ + //@SaCheckPermission("payment:sydFlows:list") + @GetMapping("/list") + public TableDataInfo list(SysSydFlowsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + return sysSydFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商流水列表 + */ + //@SaCheckPermission("payment:sydFlows:export") + @Log(title = "服务商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydFlowsBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + List list = sysSydFlowsService.queryList(bo); + ExcelUtil.exportExcelInclude(list, "服务商流水", SysSydFlowsVo.class, response,fieldList); + } + + /** + * 导出服务商交易流水B2B回单 + * @param ids 交易流水id(多个逗号分隔) + */ + @Log(title = "导出服务商交易流水B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2B") + public void exportB2B(@NotBlank(message = "交易流水id不能为空") String ids, HttpServletResponse response) throws IOException { + SysSydFlowsBo where = new SysSydFlowsBo(); + where.setPayReceiptType(1); + where.setParams(new HashMap<>()); + where.getParams().put("ids",ids); + List details = sysSydFlowsService.queryList(where); + List b2bs = StreamUtils.toList(details,SysSydFlowsVo::getPayReceipt, b2b -> StringUtils.isNotBlank(b2b)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2bs); + } + + /** + * 导出服务商交易流水B2C回单 + * @param ids 交易流水id(多个逗号分隔) + */ + @Log(title = "导出服务商交易流水B2C回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2C") + public void exportB2C(@NotBlank(message = "交易流水id不能为空") String ids, HttpServletResponse response) throws IOException { + SysSydFlowsBo where = new SysSydFlowsBo(); + where.setPayReceiptType(2); + where.setParams(new HashMap<>()); + where.getParams().put("ids",ids); + List details = sysSydFlowsService.queryList(where); + List b2cs = StreamUtils.toList(details,SysSydFlowsVo::getPayReceipt, b2c -> StringUtils.isNotBlank(b2c)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2cs); + } + + /** + * 获取服务商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydFlowsService.queryById(id)); + } + + /** + * 新增服务商流水 + */ + @SaCheckPermission("payment:sydFlows:add") + @Log(title = "服务商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydFlowsBo bo) { + return toAjax(sysSydFlowsService.insertByBo(bo)); + } + + /** + * 修改服务商流水 + */ + @SaCheckPermission("payment:sydFlows:edit") + @Log(title = "服务商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydFlowsBo bo) { + return toAjax(sysSydFlowsService.updateByBo(bo)); + } + + /** + * 删除服务商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydFlows:remove") + @Log(title = "服务商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java new file mode 100644 index 0000000..566ab98 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.service.ISysSydLogService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商变动记录 + * 前端访问路由地址为:/payment/sydLog + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydLog") +public class SysSydLogController extends BaseController { + + private final ISysSydLogService sysSydLogService; + + /** + * 查询服务商变动记录列表 + */ + @SaCheckPermission("payment:sydLog:list") + @GetMapping("/list") + public TableDataInfo list(SysSydLogBo bo, PageQuery pageQuery) { + return sysSydLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商变动记录列表 + */ + @SaCheckPermission("payment:sydLog:export") + @Log(title = "服务商变动记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydLogBo bo, HttpServletResponse response) { + List list = sysSydLogService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商变动记录", SysSydLogVo.class, response); + } + + /** + * 获取服务商变动记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydLogService.queryById(id)); + } + + /** + * 新增服务商变动记录 + */ + @SaCheckPermission("payment:sydLog:add") + @Log(title = "服务商变动记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydLogBo bo) { + return toAjax(sysSydLogService.insertByBo(bo)); + } + + /** + * 修改服务商变动记录 + */ + @SaCheckPermission("payment:sydLog:edit") + @Log(title = "服务商变动记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydLogBo bo) { + return toAjax(sysSydLogService.updateByBo(bo)); + } + + /** + * 删除服务商变动记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydLog:remove") + @Log(title = "服务商变动记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java new file mode 100644 index 0000000..9005a3b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java @@ -0,0 +1,127 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.payment.sys.service.ISysSydProductService; +import org.dromara.system.api.model.LoginUser; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商产品 + * 前端访问路由地址为:/payment/sydProduct + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydProduct") +public class SysSydProductController extends BaseController { + + private final ISysSydProductService sysSydProductService; + + /** + * 查询服务商产品列表 + */ + //@SaCheckPermission("payment:sydProduct:list") + @GetMapping("/list") + public TableDataInfo list(SysSydProductBo bo, PageQuery pageQuery) { + return sysSydProductService.queryPageList(bo, pageQuery); + } + + @GetMapping("/queryList") + public R> queryList(SysSydProductBo bo) { + return R.ok(sysSydProductService.queryList(bo)); + } + + /** + * 导出服务商产品列表 + */ + //@SaCheckPermission("payment:sydProduct:export") + @Log(title = "服务商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydProductBo bo, HttpServletResponse response) { + List list = sysSydProductService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商产品", SysSydProductVo.class, response); + } + + /** + * 获取服务商产品详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:sydProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydProductService.queryById(id)); + } + + /** + * 新增服务商产品 + */ + //@SaCheckPermission("payment:sydProduct:add") + @Log(title = "服务商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydProductBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); +// bo.setSydId(loginUser.getBusId()); +// bo.setSydNo(loginUser.getBusNo()); + return toAjax(sysSydProductService.insertByBo(bo)); + } + + /** + * 修改服务商产品 + */ + //@SaCheckPermission("payment:sydProduct:edit") + @Log(title = "服务商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydProductBo bo) { + return toAjax(sysSydProductService.updateByBo(bo)); + } + + /** + * 删除服务商产品 + * + * @param ids 主键串 + */ + //@SaCheckPermission("payment:sydProduct:remove") + @Log(title = "服务商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydProductService.deleteWithValidByIds(List.of(ids), true)); + } + + + + + + @PutMapping("/upDown") + @Log(title = "服务商产品上下架", businessType = BusinessType.UPDATE) + public R upDown(Long id,Integer status){ + return R.ok(this.sysSydProductService.upDown(id,status)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java new file mode 100644 index 0000000..412c550 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.payment.sys.service.ISysSydSignContentService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商协议内容 + * 前端访问路由地址为:/payment/sydSignContent + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydSignContent") +public class SysSydSignContentController extends BaseController { + + private final ISysSydSignContentService sysSydSignContentService; + + /** + * 查询服务商协议内容列表 + */ + @SaCheckPermission("payment:sydSignContent:list") + @GetMapping("/list") + public TableDataInfo list(SysSydSignContentBo bo, PageQuery pageQuery) { + return sysSydSignContentService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商协议内容列表 + */ + @SaCheckPermission("payment:sydSignContent:export") + @Log(title = "服务商协议内容", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydSignContentBo bo, HttpServletResponse response) { + List list = sysSydSignContentService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商协议内容", SysSydSignContentVo.class, response); + } + + /** + * 获取服务商协议内容详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydSignContent:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydSignContentService.queryById(id)); + } + + /** + * 新增服务商协议内容 + */ + @SaCheckPermission("payment:sydSignContent:add") + @Log(title = "服务商协议内容", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydSignContentBo bo) { + return toAjax(sysSydSignContentService.insertByBo(bo)); + } + + /** + * 修改服务商协议内容 + */ + @SaCheckPermission("payment:sydSignContent:edit") + @Log(title = "服务商协议内容", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydSignContentBo bo) { + return toAjax(sysSydSignContentService.updateByBo(bo)); + } + + /** + * 删除服务商协议内容 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydSignContent:remove") + @Log(title = "服务商协议内容", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydSignContentService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java new file mode 100644 index 0000000..36df069 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java @@ -0,0 +1,144 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 单位基础信息 + * 前端访问路由地址为:/payment/unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unit") +public class SysUnitController extends BaseController { + + private final ISysUnitService sysUnitService; + + /** + * 查询单位基础信息列表 + */ + @SaCheckPermission("payment:unit:list") + @GetMapping("/list") + public TableDataInfo list(SysUnitBo bo, PageQuery pageQuery) { + return sysUnitService.queryPageList(bo, pageQuery); + } + + /** + * 导出单位基础信息列表 + */ + @SaCheckPermission("payment:unit:export") + @Log(title = "单位基础信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysUnitBo bo, HttpServletResponse response) { + List list = sysUnitService.queryList(bo); + ExcelUtil.exportExcel(list, "单位基础信息", SysUnitVo.class, response); + } + + /** + * 获取单位基础信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:unit:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysUnitService.queryById(id)); + } + + /** + * 新增单位基础信息 + */ + @SaCheckPermission("payment:unit:add") + @Log(title = "单位基础信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysUnitBo bo) { + return toAjax(sysUnitService.insertByBo(bo)); + } + + /** + * 修改单位基础信息 + */ + @SaCheckPermission("payment:unit:edit") + @Log(title = "单位基础信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysUnitBo bo) { + return toAjax(sysUnitService.updateByBo(bo)); + } + + /** + * 删除单位基础信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:unit:remove") + @Log(title = "单位基础信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysUnitService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取单位配置大类下面的组信息 + * @param unit_id + * @param class_alias + * @return + */ + @GetMapping(value = "/getConfGroupByUnit/{unit_id}/{class_alias}") + public R> getConfGroupByUnit(@NotEmpty(message = "单位id不能为空") @PathVariable Long unit_id, @NotEmpty(message = "配置类别不能为空") @PathVariable String class_alias) { + return R.ok(sysUnitService.getConfGroupByUnit(unit_id,class_alias)); + } + + /** + * 根据配置组查询单位配置项明细 + * @param unit_id + * @param conf_group + * @return + */ + @GetMapping(value = "/getConfDetailByUnit/{unit_id}/{conf_group}") + public R> getConfDetailByUnit(@NotEmpty(message = "单位id不能为空") @PathVariable Long unit_id, @NotEmpty(message = "配置组不能为空") @PathVariable String conf_group) { + return R.ok(sysUnitService.getConfDetailByUnit(unit_id,conf_group)); + } + + @Log(title = "编辑单位配置项", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editConfDetail") + public R editConfDetail(@RequestBody Map map) { + List lendReco = JSONObject.parseArray(map.get("confs").toString(),UnitConfDetail.class); + return toAjax(sysUnitService.editConfDetail(lendReco)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java new file mode 100644 index 0000000..b7ea3e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java @@ -0,0 +1,101 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 线下银行账户对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("acc_accounts") +public class AccAccounts extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public AccAccounts() {} + + + + public AccAccounts(String bankType, String bankCard, Short useObj, Long useObjId, String useObjName,String bankArgNo) { + this.bankType = bankType; + this.bankCard = bankCard; + this.useObj = useObj; + this.useObjId = useObjId; + this.useObjName = useObjName; + this.bankArgNo = bankArgNo; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户名称 + */ + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Short useObj; + + /** + * 使用对象id + */ + private Long useObjId; + + /** + * 使用对象名称 + */ + private String useObjName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java new file mode 100644 index 0000000..e72a869 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java @@ -0,0 +1,47 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 异步下载对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_downloads") +public class BusDownloads extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + private Integer busType; + + /** + * 附件地址 + */ + private String url; + + + private Long ossId; + + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java new file mode 100644 index 0000000..22f2357 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java @@ -0,0 +1,223 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd") +public class SysSyd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.INPUT) + private Long id; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 开户行行号 + */ + private String khhNo; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + @TableField(exist = false) + private transient Short signMode; + @TableField(exist = false) + private transient Integer signValidTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + private Integer status = 1; + + private Long threeId; + + private Long parkId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java new file mode 100644 index 0000000..dc217f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java @@ -0,0 +1,141 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商账户对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_account") +public class SysSydAccount extends BaseEntity { + + /** + * + */ + public SysSydAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public SysSydAccount(Long id,Long sydId, Long accId,Integer accType, String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String khh,String lhh,String name) { + super(); + this.id = id; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.accType = accType; + this.khh = khh; + this.lhh = lhh; + this.name = name; + + } + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 税源地id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + private Integer accType; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + + private String lhh; + + private String khh; + + private String name; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java new file mode 100644 index 0000000..526c323 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 服务商账户同步对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_account_syn") +public class SysSydAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java new file mode 100644 index 0000000..405adaa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java @@ -0,0 +1,118 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商提现记录对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_cashout") +public class SysSydCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java new file mode 100644 index 0000000..f8c53dc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java @@ -0,0 +1,71 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 服务商配置对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_config") +public class SysSydConfig extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public SysSydConfig(){} + + public SysSydConfig(Integer autoApprove) { + this.autoApprove = autoApprove; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + private Integer end; + + /** + * 税率(%) + */ + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + private Long calStyle; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java new file mode 100644 index 0000000..9dc92c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java @@ -0,0 +1,216 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商流水对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_flows") +public class SysSydFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public SysSydFlows(){} + + public SysSydFlows(Integer direction,Long sydId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType) { + this.sydId = sydId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 流水方向(0:无变动 1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java new file mode 100644 index 0000000..4e4da43 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商变动记录对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_log") +public class SysSydLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + private Long signValidTime; + + /** + * 记录时间 + */ + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java new file mode 100644 index 0000000..1e1fb01 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java @@ -0,0 +1,92 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 服务商产品对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_product") +public class SysSydProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String no; + + /** + * 配置服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + + private String invoiceIds; + + + private transient Long opId; + + + private BigDecimal setingServiceCharge; + + + private Integer proStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java new file mode 100644 index 0000000..a3bc3e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商协议内容对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_sign_content") +public class SysSydSignContent extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + @TableId(value = "id") + private Integer id; + + /** + * 协议内容 + */ + private String content; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + private Short signMode; + + private Integer signValidTime; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java new file mode 100644 index 0000000..f735117 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java @@ -0,0 +1,51 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位基础信息对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit") +public class SysUnit extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 企业名称 + */ + private String name; + + /** + * 企业编号 + */ + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Integer unitType; + + /** + * 平台客户号 + */ + private String custNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java new file mode 100644 index 0000000..b29aab7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java @@ -0,0 +1,97 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; + +/** + * 线下银行账户业务对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = AccAccounts.class, reverseConvertGenerate = false) +public class AccAccountsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 银行账户名称 + */ + @NotBlank(message = "银行账户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + @NotBlank(message = "账户协议编号(交通银行:代发操作)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + @NotNull(message = "是否使用(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer useObj; + + /** + * 使用对象id + */ + @NotNull(message = "使用对象id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long useObjId; + + /** + * 使用对象名称 + */ + @NotBlank(message = "使用对象名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String useObjName; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java new file mode 100644 index 0000000..cd949a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java @@ -0,0 +1,45 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 异步下载业务对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusDownloads.class, reverseConvertGenerate = false) +public class BusDownloadsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + @NotNull(message = "业务类型(1 用户身份证)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 附件地址 + */ + @NotBlank(message = "附件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String url; + + + private Long ossId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java new file mode 100644 index 0000000..7461e8d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java @@ -0,0 +1,53 @@ +package org.dromara.payment.sys.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.common.core.utils.DateUtils; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonBo + * @description + * @create 2024-04-24 17:12 + */ +@Data +public class ProInfoCommonBo implements Serializable { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return endTime; + } + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + + //服务商名称 + private String name; + + //服务商编号 + private String no; + + //产品编号 + private String proNo; + + //企业ID + private Long merchantId; + + //运营商或者代理商编码 + + private Long busId; +} + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java new file mode 100644 index 0000000..b1efb48 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java @@ -0,0 +1,29 @@ +package org.dromara.payment.sys.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdBo + * @description + * @create 2024-05-13 11:30 + */ +@Data +public class SysPayPwdBo implements Serializable { + + //支付密码 + @NotBlank(message = "支付密码不能为空") + private String payPwd; + + //短信验证码 + @NotBlank(message = "短信验证码不能为空") + private String smsCode; + + //域名 + private String domain; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java new file mode 100644 index 0000000..5a4cf37 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商账户业务对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydAccount.class, reverseConvertGenerate = false) +public class SysSydAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 税源地id + */ + @NotNull(message = "税源地id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + @NotNull(message = "账户类型(0:主账户 1:个人服务费账户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accType; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 已结算金额 + */ + @NotNull(message = "已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlement; + + /** + * 已开票金额 + */ + @NotNull(message = "已开票金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java new file mode 100644 index 0000000..7e2bd54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 服务商账户同步业务对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydAccountSyn.class, reverseConvertGenerate = false) +public class SysSydAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java new file mode 100644 index 0000000..53dea2e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java @@ -0,0 +1,234 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 服务商业务对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSyd.class, reverseConvertGenerate = false) +public class SysSydBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 结算中心名称 + */ + @NotBlank(message = "结算中心名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String gsmc; + + /** + * 开户地 + */ + @NotBlank(message = "开户地不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfh; + + /** + * 开户行行号 + */ + @NotBlank(message = "开户行行号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 银行类型(字典) + */ + @NotNull(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人 + */ + @NotBlank(message = "法人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frCardid; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frPhone; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conName; + + /** + * 联系人手机号 + */ + @NotBlank(message = "联系人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conPhone; + + /** + * 联系人身份证 + */ + @NotBlank(message = "联系人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conCardid; + + /** + * 联系人邮箱 + */ + @NotBlank(message = "联系人邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conEmail; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String domain; + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + + private Integer status = 1; + + private Long threeId; + + private Long parkId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java new file mode 100644 index 0000000..4fc3a20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java @@ -0,0 +1,123 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商提现记录业务对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydCashout.class, reverseConvertGenerate = false) +public class SysSydCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + @NotNull(message = "结算中心账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java new file mode 100644 index 0000000..2b955f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java @@ -0,0 +1,68 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; + +/** + * 服务商配置业务对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydConfig.class, reverseConvertGenerate = false) +public class SysSydConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + @NotNull(message = "结算中心id(0:默认配置)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + @NotNull(message = "收税开始范围(单位:分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + @NotNull(message = "收税结束范围(单位:分,-1无限大)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer end; + + /** + * 税率(%) + */ + @NotNull(message = "税率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + @NotNull(message = "是否能使用临时税务登记证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + @NotNull(message = "计算方式(1:普通 2:逆向)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long calStyle; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java new file mode 100644 index 0000000..27f6122 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商流水业务对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydFlows.class, reverseConvertGenerate = false) +public class SysSydFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java new file mode 100644 index 0000000..0d8d248 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java @@ -0,0 +1,237 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 服务商变动记录业务对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydLog.class, reverseConvertGenerate = false) +public class SysSydLogBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 结算中心名称 + */ + @NotBlank(message = "结算中心名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String gsmc; + + /** + * 开户地 + */ + @NotBlank(message = "开户地不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfh; + + /** + * 银行类型(字典) + */ + @NotNull(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 基本税率(%) + */ + @NotNull(message = "基本税率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @NotNull(message = "引用数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quoteNum; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 省id + */ + @NotNull(message = "省id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long provinceId; + + /** + * 省名称 + */ + @NotBlank(message = "省名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String provinceName; + + /** + * 市id + */ + @NotNull(message = "市id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cityId; + + /** + * 市名称 + */ + @NotBlank(message = "市名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cityName; + + /** + * 县区id + */ + @NotNull(message = "县区id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long countyId; + + /** + * 县区名称 + */ + @NotBlank(message = "县区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String countyName; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人 + */ + @NotBlank(message = "法人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frCardid; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frPhone; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conName; + + /** + * 联系人手机号 + */ + @NotBlank(message = "联系人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conPhone; + + /** + * 联系人身份证 + */ + @NotBlank(message = "联系人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conCardid; + + /** + * 联系人邮箱 + */ + @NotBlank(message = "联系人邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conEmail; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 经营范围 + */ + @NotBlank(message = "经营范围不能为空", groups = { AddGroup.class, EditGroup.class }) + private String business; + + /** + * 税源地简称 + */ + @NotBlank(message = "税源地简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + @NotNull(message = "限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + @NotNull(message = "自雇者签约模式(0:不用签约 1:需要签约 2:共享签约)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + @NotNull(message = "自雇者签约有效期(年)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long signValidTime; + + /** + * 记录时间 + */ + @NotNull(message = "记录时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java new file mode 100644 index 0000000..b836dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java @@ -0,0 +1,107 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 服务商产品业务对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydProduct.class, reverseConvertGenerate = false) +public class SysSydProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + //@NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + //@NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 配置服务费率(%) + */ + @NotNull(message = "配置服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式(1:个人应得计费、2:开票金额计费)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式(1:到卡 2:余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 运营商id + */ + private Long opId; + + /** + * 开票类目列表 + */ + private List invoiceItemList; + + + private BigDecimal setingServiceCharge; + + private String invoiceIds; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java new file mode 100644 index 0000000..b8022d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商协议内容业务对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydSignContent.class, reverseConvertGenerate = false) +public class SysSydSignContentBo extends BaseEntity { + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 协议内容 + */ + @NotBlank(message = "协议内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java new file mode 100644 index 0000000..43101f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java @@ -0,0 +1,59 @@ +package org.dromara.payment.sys.domain.bo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 单位基础信息业务对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnit.class, reverseConvertGenerate = false) +public class SysUnitBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 企业编号 + */ + @NotBlank(message = "企业编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer unitType; + + /** + * 平台客户号 + */ + @NotBlank(message = "平台客户号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String custNo; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java new file mode 100644 index 0000000..7287207 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.syd.domain.syd.RemoteAccAccountsVo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 线下银行账户Convert接口 + * + * @author LionLi + * @date 2024-03-27 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface AccAccountsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java new file mode 100644 index 0000000..ef7de92 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.syd.domain.syd.RemoteSysSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 用户信息转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSydVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java new file mode 100644 index 0000000..de0f1cb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; +import org.dromara.payment.api.syd.domain.RemoteSysUnitVo; + +/** + * 单位基础信息Convert接口 + * + * @author LionLi + * @date 2024-03-27 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java new file mode 100644 index 0000000..c0e6bd4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.AccAccounts; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 线下银行账户视图对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = AccAccounts.class) +public class AccAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 银行账户名称 + */ + @ExcelProperty(value = "银行账户名称") + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + @ExcelProperty(value = "账户协议编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "交=通银行:代发操作") + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + @ExcelProperty(value = "是否使用", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "使用对象", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer useObj; + + /** + * 使用对象id + */ + @ExcelProperty(value = "使用对象id") + private Long useObjId; + + /** + * 使用对象名称 + */ + @ExcelProperty(value = "使用对象名称") + private String useObjName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java new file mode 100644 index 0000000..5bec61a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java @@ -0,0 +1,56 @@ +package org.dromara.payment.sys.domain.vo; + +import org.dromara.payment.sys.domain.BusDownloads; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 异步下载视图对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusDownloads.class) +public class BusDownloadsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + @ExcelProperty(value = "业务类型(1 用户身份证)") + private Integer busType; + + /** + * 附件地址 + */ + @ExcelProperty(value = "附件地址") + private String url; + + + private Long ossId; + + + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java new file mode 100644 index 0000000..3d34647 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java @@ -0,0 +1,75 @@ +package org.dromara.payment.sys.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonVo + * @description + * @create 2024-04-24 17:05 + */ + +@Data +public class ProInfoCommonVo implements Serializable { + + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty("产品编号") + private String proNo; + + @ExcelProperty("代理商名称") + private String channelName; + + @ExcelProperty("服务商名称") + private String serviceName; + + @ExcelProperty("服务商编号") + private String serviceNo; + + @ExcelProperty("业务类型") + private Integer busType; + + @ExcelProperty("开票类型") + private Integer invoiceType; + + @ExcelProperty("开票项目") + private String invoiceItems; + + @ExcelProperty("费率(%)") + private BigDecimal serviceCharge; + + @ExcelProperty("计费模式") + private Integer chargeMode; + + @ExcelProperty("到账方式") + private Integer settlementStyle; + + private Long maxMonth; + + + @ExcelProperty("单月发放上限(元)") + private String maxMonthStr; + + @ExcelProperty("上架状态") + private Integer proStatus; + + public String getMaxMonthStr() { + if(maxMonth != null) { + return StringUtils.fenToYuanFormatter(maxMonth); + }else { + return "--"; + } + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java new file mode 100644 index 0000000..fcc8c7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java @@ -0,0 +1,21 @@ +package org.dromara.payment.sys.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class SelectSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long merId; + + private Long sydId; + + private String sydName; + + private String sydNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java new file mode 100644 index 0000000..d6956c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java @@ -0,0 +1,62 @@ +package org.dromara.payment.sys.domain.vo; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商账户同步视图对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydAccountSyn.class) +public class SysSydAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java new file mode 100644 index 0000000..f3a53aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java @@ -0,0 +1,141 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商账户视图对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydAccount.class) +public class SysSydAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 税源地id + */ + @ExcelProperty(value = "税源地id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + @ExcelProperty(value = "账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:主账户,1=:个人服务费账户") + private Long accType; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 已结算金额 + */ + @ExcelProperty(value = "已结算金额") + private Long settlement; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java new file mode 100644 index 0000000..58e4b51 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java @@ -0,0 +1,143 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商提现记录视图对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydCashout.class) +public class SysSydCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心账户id + */ + @ExcelProperty(value = "结算中心账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java new file mode 100644 index 0000000..208983b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import org.dromara.payment.sys.domain.SysSydConfig; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商配置视图对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydConfig.class) +public class SysSydConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + @ExcelProperty(value = "结算中心id(0:默认配置)") + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + @ExcelProperty(value = "收税开始范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:分") + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + @ExcelProperty(value = "收税结束范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:分,-1无限大") + private Integer end; + + /** + * 税率(%) + */ + @ExcelProperty(value = "税率", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "%=") + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + @ExcelProperty(value = "是否能使用临时税务登记证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + @ExcelProperty(value = "计算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:普通,2=:逆向") + private Long calStyle; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java new file mode 100644 index 0000000..f28781b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java @@ -0,0 +1,244 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.SysSydFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商流水视图对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydFlows.class) +public class SysSydFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "招=行,交行,手动") + private String channel; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java new file mode 100644 index 0000000..bfa4460 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java @@ -0,0 +1,247 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商变动记录视图对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydLog.class) +public class SysSydLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String no; + + /** + * 结算中心名称 + */ + @ExcelProperty(value = "结算中心名称") + private String gsmc; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 基本税率(%) + */ + @ExcelProperty(value = "基本税率(%)") + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @ExcelProperty(value = "引用数量") + private Long quoteNum; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 省id + */ + @ExcelProperty(value = "省id") + private Long provinceId; + + /** + * 省名称 + */ + @ExcelProperty(value = "省名称") + private String provinceName; + + /** + * 市id + */ + @ExcelProperty(value = "市id") + private Long cityId; + + /** + * 市名称 + */ + @ExcelProperty(value = "市名称") + private String cityName; + + /** + * 县区id + */ + @ExcelProperty(value = "县区id") + private Long countyId; + + /** + * 县区名称 + */ + @ExcelProperty(value = "县区名称") + private String countyName; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 法人 + */ + @ExcelProperty(value = "法人") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frCardid; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frPhone; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String conName; + + /** + * 联系人手机号 + */ + @ExcelProperty(value = "联系人手机号") + private String conPhone; + + /** + * 联系人身份证 + */ + @ExcelProperty(value = "联系人身份证") + private String conCardid; + + /** + * 联系人邮箱 + */ + @ExcelProperty(value = "联系人邮箱") + private String conEmail; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 经营范围 + */ + @ExcelProperty(value = "经营范围") + private String business; + + /** + * 税源地简称 + */ + @ExcelProperty(value = "税源地简称") + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + @ExcelProperty(value = "限制金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不限,其=它:同结算中心下单自雇者单月实际到手金额") + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + @ExcelProperty(value = "自雇者签约模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不用签约,1=:需要签约,2=:共享签约") + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + @ExcelProperty(value = "自雇者签约有效期", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "年=") + private Long signValidTime; + + /** + * 记录时间 + */ + @ExcelProperty(value = "记录时间") + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java new file mode 100644 index 0000000..8e3a8b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java @@ -0,0 +1,270 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.SysSydProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商产品视图对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydProduct.class) +public class SysSydProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 服务商id + */ + @ExcelProperty(value = "服务商id") + private Long sydId; + + /** + * 服务商编号 + */ + @ExcelProperty(value = "服务商编号") + private String sydNo; + + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String no; + + /** + * 配置服务费率(%) + */ + @ExcelProperty(value = "配置服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 运营商配置服务费率(%) + */ + private BigDecimal setingServiceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + + @ExcelIgnore + private Integer proStatus; + + @ExcelIgnore + private Long proId; + + @ExcelIgnore + private String proNo; + + @ExcelIgnore + private String maxMonthStr; + + + private String invoiceIds; + + + public String getInvoiceIds() { + return invoiceIds; + } + + public void setInvoiceIds(String invoiceIds) { + this.invoiceIds = invoiceIds; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSydId() { + return sydId; + } + + public void setSydId(Long sydId) { + this.sydId = sydId; + } + + public String getSydNo() { + return sydNo; + } + + public void setSydNo(String sydNo) { + this.sydNo = sydNo; + } + + public String getSydName() { + return sydName; + } + + public void setSydName(String sydName) { + this.sydName = sydName; + } + + public Long getBusType() { + return busType; + } + + public void setBusType(Long busType) { + this.busType = busType; + } + + public String getNo() { + return no; + } + + public void setNo(String no) { + this.no = no; + } + + public BigDecimal getServiceCharge() { + return serviceCharge; + } + + public void setServiceCharge(BigDecimal serviceCharge) { + this.serviceCharge = serviceCharge; + } + + public BigDecimal getSetingServiceCharge() { + return setingServiceCharge; + } + + public void setSetingServiceCharge(BigDecimal setingServiceCharge) { + this.setingServiceCharge = setingServiceCharge; + } + + public Long getChargeMode() { + return chargeMode; + } + + public void setChargeMode(Long chargeMode) { + this.chargeMode = chargeMode; + } + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + public Long getMaxMonth() { + return maxMonth; + } + + public void setMaxMonth(Long maxMonth) { + this.maxMonth = maxMonth; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public String getInvoiceItems() { + return invoiceItems; + } + + public void setInvoiceItems(String invoiceItems) { + this.invoiceItems = invoiceItems; + } + + public Integer getProStatus() { + return proStatus; + } + + public void setProStatus(Integer proStatus) { + this.proStatus = proStatus; + } + + public Long getProId() { + return proId; + } + + public void setProId(Long proId) { + this.proId = proId; + } + + public String getProNo() { + return proNo; + } + + public void setProNo(String proNo) { + this.proNo = proNo; + } + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + public void setMaxMonthStr(String maxMonthStr) { + this.maxMonthStr = maxMonthStr; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java new file mode 100644 index 0000000..ff05391 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商协议内容视图对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydSignContent.class) +public class SysSydSignContentVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long id; + + /** + * 协议内容 + */ + @ExcelProperty(value = "协议内容") + private String content; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java new file mode 100644 index 0000000..461cf08 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java @@ -0,0 +1,259 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSyd; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商视图对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSyd.class) +public class SysSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String no; + + /** + * 结算中心名称 + */ + @ExcelProperty(value = "结算中心名称") + private String gsmc; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 基本税率(%) + */ + @ExcelProperty(value = "基本税率(%)") + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @ExcelProperty(value = "引用数量") + private Long quoteNum; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 省id + */ + @ExcelProperty(value = "省id") + private Long provinceId; + + /** + * 省名称 + */ + @ExcelProperty(value = "省名称") + private String provinceName; + + /** + * 市id + */ + @ExcelProperty(value = "市id") + private Long cityId; + + /** + * 市名称 + */ + @ExcelProperty(value = "市名称") + private String cityName; + + /** + * 县区id + */ + @ExcelProperty(value = "县区id") + private Long countyId; + + /** + * 县区名称 + */ + @ExcelProperty(value = "县区名称") + private String countyName; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 法人 + */ + @ExcelProperty(value = "法人") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frCardid; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frPhone; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String conName; + + /** + * 联系人手机号 + */ + @ExcelProperty(value = "联系人手机号") + private String conPhone; + + /** + * 联系人身份证 + */ + @ExcelProperty(value = "联系人身份证") + private String conCardid; + + /** + * 联系人邮箱 + */ + @ExcelProperty(value = "联系人邮箱") + private String conEmail; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 经营范围 + */ + @ExcelProperty(value = "经营范围") + private String business; + + /** + * 税源地简称 + */ + @ExcelProperty(value = "税源地简称") + private String abridge; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + private String fwf; + + private Integer status = 1; + + private Long threeId; + + private Long parkId; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java new file mode 100644 index 0000000..57f92ee --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java @@ -0,0 +1,63 @@ +package org.dromara.payment.sys.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.payment.sys.domain.SysUnit; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 单位基础信息视图对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnit.class) +public class SysUnitVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String name; + + /** + * 企业编号 + */ + @ExcelProperty(value = "企业编号") + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "企业类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户") + private Integer unitType; + + /** + * 平台客户号 + */ + @ExcelProperty(value = "平台客户号") + private String custNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java new file mode 100644 index 0000000..eea790b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java @@ -0,0 +1,18 @@ +package org.dromara.payment.sys.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.payment.api.syd.RemoteSydService; +import org.springframework.stereotype.Service; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSydServiceImpl implements RemoteSydService { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java new file mode 100644 index 0000000..fdadaa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java @@ -0,0 +1,49 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 线下银行账户Mapper接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface AccAccountsMapper extends BaseMapperPlus { + /** + * 查询未使用的银行账户 + * @author 张涛 + * @date 2022年7月8日 + * @param sydId 结算中心id + * @param bankType 账户类型 + * @return + */ + public List selectNoUseBySydId(@Param("sydId") long sydId, @Param("bankType") String bankType); + + /** + * 查询账户信息 + * @author 张涛 + * @date 2022年7月8日 + * @param bankCard 账户卡号 + * @param bankType 账户类型 + * @return + */ + public AccAccounts selectByCardAndType(@Param("bankCard") String bankCard,@Param("bankType") String bankType); + + /** + * 使用账户 + * @author 张涛 + * @date 2022年7月8日 + * @param acc + * @return + */ + public Integer useAccount(AccAccounts acc); + + int updateByPrimaryKeySelective(AccAccounts record); + + int insertSelective(AccAccounts record); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java new file mode 100644 index 0000000..9d18184 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 异步下载Mapper接口 + * + * @author LionLi + * @date 2024-06-21 + */ +public interface BusDownloadsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java new file mode 100644 index 0000000..600d79f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java @@ -0,0 +1,93 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; + +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommnoMapper + * @description + * @create 2024-04-24 17:31 + */ +public interface ProInfoCommnoMapper { + + + Page selectCommonProListAgent(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + Page selectCommonProListMer(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + Page selectCommonProListOper(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-24 18:52 + * 说明:查询代理商业务类型 + **/ + + List selectAgentBusType( @Param(Constants.WRAPPER) Wrapper wrapper); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-24 18:52 + * 说明:查询运营商业务类型 + **/ + List selectOperBusType( @Param(Constants.WRAPPER) Wrapper wrapper); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:45 + * 说明:给企业分配产品,查询服务商 + **/ + + List selectAgentService(ProInfoCommonBo commonBo); + + + + + /*** + * 根据企业信息,查询企业对应的服务商 + * @param merchantVo + * @return + */ + List selectServiceInfoByMerInfo(BusMerchantVo merchantVo); + + + /*** + * 根据企业信息,服务商信息,查询对应的业务类型 + * @param map + * @return + */ + List selectBusTypeByMerSerInfo(Map map); + + + /*** + * 查询服务商对应的企业 + * @param id + * @return + */ + List selectMerListByServiceId(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java new file mode 100644 index 0000000..fed2b7a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.operator.domain.BusOperator; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdMapper + * @description + * @create 2024-05-13 13:55 + */ +public interface SysPayPwdMapper { + + + /*** + * 更改代理商的支付密码 + * @param busOperator + * @return + */ + int updateBusOperatorPayPwd(BusOperator busOperator); + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java new file mode 100644 index 0000000..667cf44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java @@ -0,0 +1,177 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 服务商账户Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydAccountMapper extends BaseMapperPlus { + /** + * 查询税源地虚拟银行账号 + * + * @param id 税源地虚拟银行账号ID + * @return 税源地虚拟银行账号 + */ + public SysSydAccount selectSysSydAccountById(Long id); + + /** + * 查询税源地虚拟银行账号列表 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 税源地虚拟银行账号集合 + */ + public List selectSysSydAccountList(SysSydAccount sysSydAccount); + + /** + * 新增税源地虚拟银行账号 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 结果 + */ + public int insertSysSydAccount(SysSydAccount sysSydAccount); + + /** + * 修改税源地虚拟银行账号 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 结果 + */ + public int updateSysSydAccount(SysSydAccount sysSydAccount); + + /** + * 删除税源地虚拟银行账号 + * + * @param id 税源地虚拟银行账号ID + * @return 结果 + */ + public int deleteSysSydAccountById(Long id); + + /** + * 批量删除税源地虚拟银行账号 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSysSydAccountByIds(String[] ids); + + /** + * 修改结算中心开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmount(@Param("sydId") Integer sydId, @Param("accType") short accType, @Param("invoice") long invoice, @Param("bankType") String bankType); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlement(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 查询结算中心的默认账户 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @return + */ + public List selectSysSydAccountBySydId(@Param("sydId") Long sydId,@Param("accType") Short accType,@Param("bankType") String bankType); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 根据银行账户id更新 + * @author 张涛 + * @date 2021年9月6日 + * @param record + * @return + */ + public Integer updateByAccId(SysSydAccount record); + + /** + * 修改结算中心开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmountByAccId(@Param("accId") int accId, @Param("invoice") long invoice); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlementByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + public Long selectSysdAccount(Map map); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java new file mode 100644 index 0000000..f40f124 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商账户同步Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydAccountSynMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java new file mode 100644 index 0000000..2dc8fe1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydCashoutMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java new file mode 100644 index 0000000..eaa1fa3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商配置Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java new file mode 100644 index 0000000..080aae8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 服务商流水Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydFlowsMapper extends BaseMapperPlus { + + public int insertSelective(SysSydFlows flow); + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java new file mode 100644 index 0000000..0a2a89a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java @@ -0,0 +1,18 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.Date; + +/** + * 服务商变动记录Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydLogMapper extends BaseMapperPlus { + public Integer insertSysSydLog(@Param("sydId") long sydId,@Param("curTime") Date curTime); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java new file mode 100644 index 0000000..3d31452 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 服务商Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydMapper extends BaseMapperPlus { + /** + * 查询税源地 + * + * @param id 税源地ID + * @return 税源地 + */ + public SysSyd selectSysSydById(Long id); + + /** + * 修改税源地 + * + * @param sysSyd 税源地 + * @return 结果 + */ + public int updateSysSyd(SysSyd sysSyd); + + /** + * 查询商户可用的服务商 + * @param merId 商户id + * @return + */ + public List selectSydByMerId(Long merId); + + + + Page selectSydList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java new file mode 100644 index 0000000..a9302fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java @@ -0,0 +1,30 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 服务商产品Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydProductMapper extends BaseMapperPlus { + + Page queryPageList(@Param("page") Page page, @Param("where") SysSydProductBo where); + + List queryList(@Param("where") SysSydProductBo where); + + BigDecimal selMinServiceChargeByproId(Long proId); + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java new file mode 100644 index 0000000..1be9363 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商协议内容Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydSignContentMapper extends BaseMapperPlus { + int insertSelective(SysSydSignContent record); + + SysSydSignContent selectByPrimaryKey(Integer id); + + int updateByPrimaryKeySelective(SysSydSignContent record); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java new file mode 100644 index 0000000..c192d6c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位基础信息Mapper接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface SysUnitMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java new file mode 100644 index 0000000..98fb747 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 线下银行账户Service接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface IAccAccountsService { + + /** + * 查询线下银行账户 + */ + AccAccountsVo queryById(Long id); + + /** + * 查询线下银行账户列表 + */ + TableDataInfo queryPageList(AccAccountsBo bo, PageQuery pageQuery); + + /** + * 查询线下银行账户列表 + */ + List queryList(AccAccountsBo bo); + + /** + * 新增线下银行账户 + */ + Boolean insertByBo(AccAccountsBo bo); + + /** + * 修改线下银行账户 + */ + Boolean updateByBo(AccAccountsBo bo); + + /** + * 校验并批量删除线下银行账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java new file mode 100644 index 0000000..6501b0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 异步下载Service接口 + * + * @author LionLi + * @date 2024-06-21 + */ +public interface IBusDownloadsService { + + /** + * 查询异步下载 + */ + BusDownloadsVo queryById(Long id); + + /** + * 查询异步下载列表 + */ + TableDataInfo queryPageList(BusDownloadsBo bo, PageQuery pageQuery); + + /** + * 查询异步下载列表 + */ + List queryList(BusDownloadsBo bo); + + /** + * 新增异步下载 + */ + Boolean insertByBo(BusDownloadsBo bo); + + /** + * 修改异步下载 + */ + Boolean updateByBo(BusDownloadsBo bo); + + /** + * 校验并批量删除异步下载信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java new file mode 100644 index 0000000..8e48ce9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java @@ -0,0 +1,75 @@ +package org.dromara.payment.sys.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title IProInfoCommonService + * @description + * @create 2024-04-24 17:34 + */ +public interface IProInfoCommonService { + + + TableDataInfo queryPageList(ProInfoCommonBo bo, PageQuery pageQuery); + + + /*** + * 查询不同角色的业务类型 + * @return + */ + List selDifRoleBusType(); + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:46 + * 说明:给企业分配产品,对应的服务商查询,过滤已经分配过的服务商 + **/ + + List selectAgentService(ProInfoCommonBo commonBo); + + + /*** + * 根据不同的角色查询企业列表 + * @param commonBo + * @return + */ + List selectMerchantList(ProInfoCommonBo commonBo); + + + /*** + * 根据企业信息查询对应的服务商 + * @param merchantVo + * @return + */ + List selectServiceInfoByMerInfo(BusMerchantVo merchantVo); + + + /*** + * 根据企业信息,服务商信息,查询对应的业务类型 + * @param merId + * @param sydId + * @return + */ + List selectBusTypeByMerSerInfo(Long merId,Long sydId); + + + public List selectBusTypeByMerSerInfoName(Long merId, Long sydId); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java new file mode 100644 index 0000000..0826e47 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java @@ -0,0 +1,29 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; + +/** + * @author sunzexing + * @version 1.0 + * @title ISysPayPwdService + * @description + * @create 2024-05-13 11:29 + */ +public interface ISysPayPwdService { + + + /*** + * 修改支付密码 + * @param bo + * @return + */ + public String updPayPwd(SysPayPwdBo bo); + + + /*** + * 发送短信密码 + * @param domain + * @return + */ + public boolean sendSmsCode(String domain); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java new file mode 100644 index 0000000..b79f3b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java @@ -0,0 +1,95 @@ +package org.dromara.payment.sys.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商账户Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydAccountService { + + /** + * 查询服务商账户 + */ + SysSydAccountVo queryById(Long id); + + /** + * 查询服务商账户列表 + */ + TableDataInfo queryPageList(SysSydAccountBo bo, PageQuery pageQuery); + + /** + * 查询服务商账户列表 + */ + List queryList(SysSydAccountBo bo); + + /** + * 新增服务商账户 + */ + Boolean insertByBo(SysSydAccountBo bo); + + /** + * 修改服务商账户 + */ + Boolean updateByBo(SysSydAccountBo bo); + + /** + * 校验并批量删除服务商账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(Long sydId,long unitId,long amount,String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(Long sydId,long unitId,long amount,String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询服务商提现账户信息 + * @param id 资金账户id + * @return + */ + public SysSydAccountVo getCashoutAccount(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java new file mode 100644 index 0000000..01b7822 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商账户同步Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydAccountSynService { + + /** + * 查询服务商账户同步 + */ + SysSydAccountSynVo queryById(Long id); + + /** + * 查询服务商账户同步列表 + */ + TableDataInfo queryPageList(SysSydAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询服务商账户同步列表 + */ + List queryList(SysSydAccountSynBo bo); + + /** + * 新增服务商账户同步 + */ + Boolean insertByBo(SysSydAccountSynBo bo); + + /** + * 修改服务商账户同步 + */ + Boolean updateByBo(SysSydAccountSynBo bo); + + /** + * 校验并批量删除服务商账户同步信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java new file mode 100644 index 0000000..97e9d93 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java @@ -0,0 +1,59 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商提现记录Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydCashoutService { + + /** + * 查询服务商提现记录 + */ + SysSydCashoutVo queryById(Long id); + + /** + * 查询服务商提现记录列表 + */ + TableDataInfo queryPageList(SysSydCashoutBo bo, PageQuery pageQuery); + + /** + * 查询服务商提现记录列表 + */ + List queryList(SysSydCashoutBo bo); + + /** + * 提现记录 + */ + Boolean insertByBo(SysSydCashoutBo bo); + + /** + * 修改服务商提现记录 + */ + Boolean updateByBo(SysSydCashoutBo bo); + + /** + * 校验并批量删除服务商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java new file mode 100644 index 0000000..666f8fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商配置Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydConfigService { + + /** + * 查询服务商配置 + */ + SysSydConfigVo queryById(Long id); + + /** + * 查询服务商配置列表 + */ + TableDataInfo queryPageList(SysSydConfigBo bo, PageQuery pageQuery); + + /** + * 查询服务商配置列表 + */ + List queryList(SysSydConfigBo bo); + + /** + * 新增服务商配置 + */ + Boolean insertByBo(SysSydConfigBo bo); + + /** + * 修改服务商配置 + */ + Boolean updateByBo(SysSydConfigBo bo); + + /** + * 校验并批量删除服务商配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java new file mode 100644 index 0000000..7e374af --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商流水Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydFlowsService { + + /** + * 查询服务商流水 + */ + SysSydFlowsVo queryById(Long id); + + /** + * 查询服务商流水列表 + */ + TableDataInfo queryPageList(SysSydFlowsBo bo, PageQuery pageQuery); + + /** + * 查询服务商流水列表 + */ + List queryList(SysSydFlowsBo bo); + + /** + * 新增服务商流水 + */ + Boolean insertByBo(SysSydFlowsBo bo); + + /** + * 修改服务商流水 + */ + Boolean updateByBo(SysSydFlowsBo bo); + + /** + * 校验并批量删除服务商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java new file mode 100644 index 0000000..ab350cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商变动记录Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydLogService { + + /** + * 查询服务商变动记录 + */ + SysSydLogVo queryById(Long id); + + /** + * 查询服务商变动记录列表 + */ + TableDataInfo queryPageList(SysSydLogBo bo, PageQuery pageQuery); + + /** + * 查询服务商变动记录列表 + */ + List queryList(SysSydLogBo bo); + + /** + * 新增服务商变动记录 + */ + Boolean insertByBo(SysSydLogBo bo); + + /** + * 修改服务商变动记录 + */ + Boolean updateByBo(SysSydLogBo bo); + + /** + * 校验并批量删除服务商变动记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java new file mode 100644 index 0000000..e4a3d1f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商产品Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydProductService { + + /** + * 查询服务商产品 + */ + SysSydProductVo queryById(Long id); + + /** + * 查询服务商产品列表 + */ + TableDataInfo queryPageList(SysSydProductBo bo, PageQuery pageQuery); + + /** + * 查询服务商产品列表 + */ + List queryList(SysSydProductBo bo); + + /** + * 新增服务商产品 + */ + Boolean insertByBo(SysSydProductBo bo); + + /** + * 修改服务商产品 + */ + Boolean updateByBo(SysSydProductBo bo); + + /** + * 校验并批量删除服务商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + String upDown(Long id, Integer status); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java new file mode 100644 index 0000000..a991924 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java @@ -0,0 +1,128 @@ +package org.dromara.payment.sys.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.domain.SignZhifubao; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 服务商Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydService { + + /** + * 查询服务商 + */ + SysSydVo queryById(Long id); + + /** + * 查询服务商列表 + */ + TableDataInfo queryPageList(SysSydBo bo, PageQuery pageQuery); + + /** + * 查询服务商列表 + */ + List queryList(SysSydBo bo); + + /** + * 新增服务商 + */ + Boolean insertByBo(SysSydBo bo) throws Exception; + + /** + * 修改服务商 + */ + Boolean updateByBo(SysSydBo bo); + + /** + * 校验并批量删除服务商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 开通服务商虚拟户 + * @param id + * @param gsmc + * @return + */ + public Boolean creatSydXNnum(Long id, String gsmc); + + /** + * 开通虚拟户 + * @param sydId 服务商id + * @param unitId 单位id + * @param gsmc 虚拟户名称 + * @param roleType 虚拟户角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + * @param addRoleType 经办角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + * @param saveFun<添加的虚拟户,业务资金账户是否添加成功> + * @param existsFun<验证的虚拟户类型,已存在的虚拟户卡号> + * @return + */ + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType, Function saveFun, Function existsFun); + + /** + * 验证是否配置结算中心 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @return + */ + public Map valiConfig(Long sydId,String passage); + + /** + * 获取结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public SysSydSignContent getWorkerSignInfo(int sydId); + + /** + * 保存结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public Boolean saveWorkerSignInfo(SysSydSignContent sign); + + /** + * 获取结算中心的支付宝签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public SignZhifubao getSignInfo(Long sydId,String passage); + + /** + * 根据用户名查询商户可用的服务商 + * @param userName 用户名 + * @return + */ + public List getSydByUserName(String userName); + + /** + * 查询商户可用的服务商 + * @param merId 商户id + * @return + */ + public List selectSydByMerId(Long merId); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java new file mode 100644 index 0000000..f029c5a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商协议内容Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydSignContentService { + + /** + * 查询服务商协议内容 + */ + SysSydSignContentVo queryById(Long id); + + /** + * 查询服务商协议内容列表 + */ + TableDataInfo queryPageList(SysSydSignContentBo bo, PageQuery pageQuery); + + /** + * 查询服务商协议内容列表 + */ + List queryList(SysSydSignContentBo bo); + + /** + * 新增服务商协议内容 + */ + Boolean insertByBo(SysSydSignContentBo bo); + + /** + * 修改服务商协议内容 + */ + Boolean updateByBo(SysSydSignContentBo bo); + + /** + * 校验并批量删除服务商协议内容信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java new file mode 100644 index 0000000..b1d373e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java @@ -0,0 +1,73 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; + +import java.util.Collection; +import java.util.List; + +/** + * 单位基础信息Service接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface ISysUnitService { + + /** + * 查询单位基础信息 + */ + SysUnitVo queryById(Long id); + + /** + * 查询单位基础信息列表 + */ + TableDataInfo queryPageList(SysUnitBo bo, PageQuery pageQuery); + + /** + * 查询单位基础信息列表 + */ + List queryList(SysUnitBo bo); + + /** + * 新增单位基础信息 + */ + Boolean insertByBo(SysUnitBo bo); + + /** + * 修改单位基础信息 + */ + Boolean updateByBo(SysUnitBo bo); + + /** + * 校验并批量删除单位基础信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取单位配置大类下面的组信息 + * @param unit_id + * @param class_alias + * @return + */ + public List getConfGroupByUnit(Long unit_id, String class_alias); + + /** + * 根据配置组查询单位配置项明细 + * @param unit_id + * @param conf_group + * @return + */ + public List getConfDetailByUnit(Long unit_id, String conf_group); + + /** + * 编辑单位配置项明细 + * @param lendReco + * @return + */ + public Boolean editConfDetail(List lendReco); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java new file mode 100644 index 0000000..9b7a94f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.service.IAccAccountsService; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.mapper.AccAccountsMapper; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 线下银行账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Service +public class AccAccountsServiceImpl implements IAccAccountsService { + + private final AccAccountsMapper baseMapper; + + /** + * 查询线下银行账户 + */ + @Override + public AccAccountsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询线下银行账户列表 + */ + @Override + public TableDataInfo queryPageList(AccAccountsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询线下银行账户列表 + */ + @Override + public List queryList(AccAccountsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(AccAccountsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, AccAccounts::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), AccAccounts::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), AccAccounts::getBankCard, bo.getBankCard()); + lqw.like(StringUtils.isNotBlank(bo.getBankAccName()), AccAccounts::getBankAccName, bo.getBankAccName()); + lqw.eq(StringUtils.isNotBlank(bo.getBankArgNo()), AccAccounts::getBankArgNo, bo.getBankArgNo()); + lqw.eq(bo.getIsUse() != null, AccAccounts::getIsUse, bo.getIsUse()); + lqw.eq(bo.getUseObj() != null, AccAccounts::getUseObj, bo.getUseObj()); + lqw.eq(bo.getUseObjId() != null, AccAccounts::getUseObjId, bo.getUseObjId()); + lqw.like(StringUtils.isNotBlank(bo.getUseObjName()), AccAccounts::getUseObjName, bo.getUseObjName()); + lqw.eq(bo.getAddTime() != null, AccAccounts::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增线下银行账户 + */ + @Override + public Boolean insertByBo(AccAccountsBo bo) { + AccAccounts add = MapstructUtils.convert(bo, AccAccounts.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改线下银行账户 + */ + @Override + public Boolean updateByBo(AccAccountsBo bo) { + AccAccounts update = MapstructUtils.convert(bo, AccAccounts.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(AccAccounts entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除线下银行账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java new file mode 100644 index 0000000..43a5857 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java @@ -0,0 +1,164 @@ +package org.dromara.payment.sys.service.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.mapper.AccAccountsMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +public class BankAccountServiceTransactionImpl +{ + private static final Logger log = LoggerFactory.getLogger(BankAccountServiceTransactionImpl.class); + + @Autowired + private AccAccountsMapper accountsDao;//银行账户dao + + @DubboReference + private RemoteAccountService accountService;//银行账户 + + @DubboReference + private RemoteConfigService wConfigService;// 配置 + + @Transactional + public void useAccount(AccAccounts acc) { + AccAccounts exist = accountsDao.selectByCardAndType(acc.getBankCard(), acc.getBankType()); + if (exist == null) { + throw new ServiceException("账户不存在"); + } + if (exist.getIsUse() == 1) { + throw new ServiceException("账户已被使用"); + } + AccAccounts upd = new AccAccounts(); + upd.setId(exist.getId()); + upd.setIsUse(1); + upd.setUseObj(acc.getUseObj()); + upd.setUseObjId(acc.getUseObjId()); + upd.setUseObjName(acc.getUseObjName()); + upd.setBankArgNo(acc.getBankArgNo()); + Integer num = accountsDao.useAccount(upd); + if (num == 0) { + throw new ServiceException("账户已被使用"); + } + } + + @Transactional + public void updateAccountArgNo(AccAccounts acc) { + String bankType = "交通银行"; + if(acc.getBankType().equals(bankType)) { + Map configMap = existsBank(acc.getSydId(), bankType); + if (configMap != null) { + AccAccounts exist = accountsDao.selectByCardAndType(acc.getBankCard(), acc.getBankType()); + if (exist == null) { + throw new ServiceException("账户不存在"); + } + Account bankAcc = new Account(); + bankAcc.setBankType(bankType); + bankAcc.setBankCard(acc.getBankCard()); + bankAcc.setUnitId(acc.getSydId()); + bankAcc.setName(acc.getBankAccName()); + bankAcc.setBankArgNo(acc.getBankArgNo()); + bankAcc.setType((short)1);//1:云账户 + Result accountRtn = accountService.addAccount(bankAcc); + if (accountRtn.hasError() || accountRtn.hasTip() || accountRtn.getRtnData() == null) { + throw new RuntimeException("修改交通银行虚拟户协议编号失败:"+accountRtn.getResult()); + } + AccAccounts upd = new AccAccounts(); + upd.setId(exist.getId()); + upd.setBankArgNo(acc.getBankArgNo()); + accountsDao.updateByPrimaryKeySelective(upd); + } + } + } + + /** + * 验证银行类型是否可用 + * @author 张涛 + * @date 2022年7月8日 + * @param sydId 结算中心id + * @param bankType 银行类型 + * @return + */ + public Map existsBank(long sydId,String bankType) { + String bankClass = ""; + if (bankType.equals("招商银行")) { + bankClass = "settlement.zhaoshang"; + } else if (bankType.equals("交通银行")) { + bankClass = "settlement.jiaotong"; + } else if (bankType.equals("支付宝")) { + bankClass = "settlement.zhifubao"; + } else if (bankType.equals("民生银行")) { + bankClass = "settlement.minsheng"; + } + Result> bankConfigRtn = wConfigService.getConfDetailByUnit(sydId, bankClass); + if (bankConfigRtn.hasError()) { + throw new RuntimeException(bankConfigRtn.getResult()); + } + boolean exists = false; + //配置明细 + Map configMap = new HashMap(); + if (bankConfigRtn.getRtnData() != null) { + for (UnitConfDetail ucd : bankConfigRtn.getRtnData()) { + if(bankType.equals("招商银行")) { + if (ucd.getConf_item().equals("zhaoshang_prikey") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + }else if (bankType.equals("交通银行")) { + if (ucd.getConf_item().equals("jiaotong_super_acc") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + }else if (bankType.equals("支付宝")) { + if (ucd.getConf_item().equals("zhifubao_bank_appid") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + } else if (bankType.equals("民生银行")) { + if (ucd.getConf_item().equals("minsheng_bank_merchantNum") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + } + configMap.put(ucd.getConf_item(), ucd.getConf_value()); + } + } + return exists ? configMap : null; + } + + /** + * 创建虚拟银行账号 + * @author 张涛 + * @date 2021年8月18日 + * @param unitId 税源地id + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @return + */ + public AccAccounts addAccount(long unitId,Long userId,String userName,String bankType){ + Result accountRtn = accountService.addAccount(unitId, 1,userId,userName,bankType,null); + if (accountRtn.hasError()) { + throw new RuntimeException(accountRtn.getResult()); + }else if (accountRtn.hasTip()) { + throw new ServiceException(accountRtn.getResult()); + } + AccAccounts newAcc = new AccAccounts(); + newAcc.setSydId(unitId); + newAcc.setBankType(accountRtn.getRtnData().getBankType()); + newAcc.setBankCard(accountRtn.getRtnData().getBankCard()); + newAcc.setBankAccName(accountRtn.getRtnData().getName()); + accountsDao.insertSelective(newAcc); + return newAcc; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java new file mode 100644 index 0000000..0aadda6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java @@ -0,0 +1,116 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.mapper.BusDownloadsMapper; +import org.dromara.payment.sys.service.IBusDownloadsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 异步下载Service业务层处理 + * + * @author LionLi + * @date 2024-06-21 + */ +@RequiredArgsConstructor +@Service +public class BusDownloadsServiceImpl implements IBusDownloadsService { + + private final BusDownloadsMapper baseMapper; + + /** + * 查询异步下载 + */ + @Override + public BusDownloadsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询异步下载列表 + */ + @Override + public TableDataInfo queryPageList(BusDownloadsBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUserId()); + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询异步下载列表 + */ + @Override + public List queryList(BusDownloadsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusDownloadsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(bo.getCreateBy() !=null,"create_by",bo.getCreateBy()); + lqw.eq(bo.getBusType() != null,"bus_type",bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), "url", bo.getUrl()); + lqw.orderByDesc("create_time"); + return lqw; + } + + /** + * 新增异步下载 + */ + @Override + public Boolean insertByBo(BusDownloadsBo bo) { + BusDownloads add = MapstructUtils.convert(bo, BusDownloads.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改异步下载 + */ + @Override + public Boolean updateByBo(BusDownloadsBo bo) { + BusDownloads update = MapstructUtils.convert(bo, BusDownloads.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusDownloads entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除异步下载 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java new file mode 100644 index 0000000..d46c8d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java @@ -0,0 +1,201 @@ +package org.dromara.payment.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.ProInfoCommnoMapper; +import org.dromara.payment.sys.service.IProInfoCommonService; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonServiceImpl + * @description + * @create 2024-04-24 17:36 + */ + +@Service +public class ProInfoCommonServiceImpl extends BaseService implements IProInfoCommonService { + + + @Resource + private ProInfoCommnoMapper proInfoCommnoMapper; + + @Resource + private BusMerchantMapper busMerchantMapper; + + @DubboReference + private RemoteDictService remoteDictService; + @Override + public TableDataInfo queryPageList(ProInfoCommonBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null ,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t2.gsmc",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t2.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getProNo()),"t1.no",bo.getProNo()); + lqw.eq("t1.pro_status",1); + lqw.orderByDesc("t.create_time"); + Page result = null; + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.channel_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListAgent( pageQuery.build(), lqw); + }else if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.mer_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListMer( pageQuery.build(), lqw); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.op_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListOper( pageQuery.build(), lqw); + }else{ + result = new Page(); + } + return TableDataInfo.build(result); + + } + + + /*** + * 获取不同角色业务类型 + * @return + */ + @Override + public List selDifRoleBusType() { + List result = null; + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + lqw.eq("t1.pro_status",1); + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.channel_no",LoginHelper.getNo()); + result =this.proInfoCommnoMapper.selectAgentBusType(lqw); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t1.pro_status",1); + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.op_no",LoginHelper.getNo()); + result =this.proInfoCommnoMapper.selectOperBusType(lqw); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.syd_id",LoginHelper.getBusId()); + result =this.proInfoCommnoMapper.selectOperBusType(lqw); + } + return result; + } + + @Override + public List selectAgentService(ProInfoCommonBo commonBo) { + if(commonBo.getMerchantId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + commonBo.setBusId(LoginHelper.getBusId()); + return this.proInfoCommnoMapper.selectAgentService(commonBo); + }else if(busRole == BusRole.OPERATOR.getId()){ + + } + return null; + } + + + + + + + public List selectMerchantList(ProInfoCommonBo commonBo){ + + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.SERVICE.getId()){ + return this.proInfoCommnoMapper.selectMerListByServiceId(LoginHelper.getBusId()); + }else{ + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.verify_status",2); + lqw.orderByDesc("t.create_time"); + + return busMerchantMapper.selectMerchantListByRole(lqw); + } + + } + + + /*** + * 根据企业信息查询对应的服务商 + * @param merchantVo + * @return + */ + @Override + public List selectServiceInfoByMerInfo(BusMerchantVo merchantVo) { + if(merchantVo.getId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + return this.proInfoCommnoMapper.selectServiceInfoByMerInfo(merchantVo); + } + + + /*** + * 根据企业信息、服务商信息,查询对应的业务类型 + * @param merId + * @param sydId + * @return + */ + @Override + public List selectBusTypeByMerSerInfo(Long merId, Long sydId) { + + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + + Map paraMap = new HashMap(); + paraMap.put("merId",merId); + paraMap.put("sydId",sydId); + + return this.proInfoCommnoMapper.selectBusTypeByMerSerInfo(paraMap); + + } + + + @Override + public List selectBusTypeByMerSerInfoName(Long merId, Long sydId){ + List busTypeList = this.selectBusTypeByMerSerInfo(merId,sydId); + List list = remoteDictService.selectDictDataByType("wxfe_bus_type"); + List result = new ArrayList(); + for(Integer bs :busTypeList){ + for(RemoteDictDataVo rd : list){ + if(bs.equals(Integer.valueOf(rd.getDictValue()))){ + result.add(rd); + break; + } + } + } + + return result; + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java new file mode 100644 index 0000000..12c1780 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.RandomUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysPayPwdMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysPayPwdService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.Date; +import java.util.LinkedHashMap; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdServiceImpl + * @description + * @create 2024-05-13 12:08 + */ +@Service +public class SysPayPwdServiceImpl extends BaseService implements ISysPayPwdService { + + @Resource + public IBusMerchantService busMerchantService; + + @Resource + public SysPayPwdMapper sysPayPwdMapper; + + @Resource + public IBusOperatorService busOperatorService; + + + @Resource + public ISysSydService sysSydService; + + + @DubboReference + public RemoteSmsService remoteSmsService; + + + @DubboReference + public RemoteUserService remoteUserService; + + + @Resource + public BusOperatorMapper busOperatorMapper; + + + @Resource + public BusMerchantMapper busMerchantMapper; + + + @Resource + public SysSydMapper sysSydMapper; + + + + + /**** + * 修改支付密码 + * @param bo + * @return + */ + @Override + public String updPayPwd(SysPayPwdBo bo) { + + Integer busRole = LoginHelper.getBusRole(); + String phone = ""; + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchantVo bmv = this.busMerchantService.queryById(LoginHelper.getBusId()); + phone = bmv.getWtrSjh(); + + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo bov = this.busOperatorService.queryById(LoginHelper.getBusId()); + phone = bov.getWtrSjh(); + + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSydVo sysVo = this.sysSydService.queryById(LoginHelper.getBusId()); + phone = sysVo.getConPhone(); + + } + String key = GlobalConstants.CAPTCHA_PAY_PWD_PHONE_CODE_KEY+ SmsType.RESET_PAY_PWD.getIType() + phone; + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isEmpty(cacheCode)){ + this.invalidationParamsException("验证码无效"); + } + + if(!cacheCode.equals(bo.getSmsCode())){ + this.invalidationParamsException("验证码无效"); + } + + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchant busBo = new BusMerchant(); + busBo.setId(LoginHelper.getBusId()); + busBo.setPayPassword(bo.getPayPwd()); + busBo.setCreateTime(new Date()); + busBo.setUpdateBy(LoginHelper.getUserId()); + this.busMerchantMapper.updateById(busBo); + updateUserResetPayTag(); + + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperator busOperatorBo = new BusOperator(); + busOperatorBo.setId(LoginHelper.getBusId()); + busOperatorBo.setPayPassword(bo.getPayPwd()); + busOperatorBo.setCreateTime(new Date()); + busOperatorBo.setUpdateBy(LoginHelper.getUserId()); + this.busOperatorMapper.updateById(busOperatorBo); + updateUserResetPayTag(); + + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSyd sysSydVo = new SysSyd(); + sysSydVo.setId(LoginHelper.getBusId()); + sysSydVo.setPayPassword(bo.getPayPwd()); + sysSydVo.setUpdateTime(new Date()); + sysSydVo.setUpdateBy(LoginHelper.getUserId()); + this.sysSydMapper.updateById(sysSydVo); + updateUserResetPayTag(); + + }else{ + this.invalidationParamsException("此用户不能修改支付密码"); + } + return "1"; + } + + private void updateUserResetPayTag() { + this.remoteUserService.updateUserResetPayTag(LoginHelper.getUserId()); + + } + + + @Override + public boolean sendSmsCode(String domain) { + Integer busRole = LoginHelper.getBusRole(); + String phone = null; + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchantVo bmv = this.busMerchantService.queryById(LoginHelper.getBusId()); + phone = bmv.getWtrSjh(); + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo bov = this.busOperatorService.queryById(LoginHelper.getBusId()); + phone = bov.getWtrSjh(); + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSydVo sov = this.sysSydService.queryById(LoginHelper.getBusId()); + phone = sov.getConPhone(); + }else{ + this.invalidationParamsException("此用户不能修改支付密码"); + } + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("经办人手机号不能为空"); + } + String key = GlobalConstants.CAPTCHA_PAY_PWD_PHONE_CODE_KEY+ SmsType.RESET_PAY_PWD.getIType() + phone; + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isNotEmpty(cacheCode)){ + this.invalidationParamsException("2分钟内不能重复发送"); + } + String code = RandomUtil.randomNumbers(4); + // RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + RemoteSms sms = this.remoteSmsService.send(domain, phone, SmsType.RESET_PAY_PWD, map); + if(sms != null){ + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(2)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java new file mode 100644 index 0000000..c832cb7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydAccountServiceImpl implements ISysSydAccountService { + + private final SysSydAccountMapper baseMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydMapper sydMapper; + + /** + * 查询服务商账户 + */ + @Override + public SysSydAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商账户列表 + */ + @Override + public TableDataInfo queryPageList(SysSydAccountBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商账户列表 + */ + @Override + public List queryList(SysSydAccountBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, SysSydAccount::getAccId, bo.getAccId()); + lqw.eq(bo.getAccType() != null, SysSydAccount::getAccType, bo.getAccType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), SysSydAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydAccount::getBankCard, bo.getBankCard()); + lqw.eq(bo.getBalance() != null, SysSydAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, SysSydAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, SysSydAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, SysSydAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getSettlement() != null, SysSydAccount::getSettlement, bo.getSettlement()); + lqw.eq(bo.getInvoice() != null, SysSydAccount::getInvoice, bo.getInvoice()); + lqw.eq(bo.getStatus() != null, SysSydAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), SysSydAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + /** + * 新增服务商账户 + */ + @Override + public Boolean insertByBo(SysSydAccountBo bo) { + SysSydAccount add = MapstructUtils.convert(bo, SysSydAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商账户 + */ + @Override + public Boolean updateByBo(SysSydAccountBo bo) { + SysSydAccount update = MapstructUtils.convert(bo, SysSydAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateBalance(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateBalance(sydId,Short.parseShort(unitId+""),amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateFrozen(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateFrozen(sydId,Short.parseShort(unitId+""),amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public SysSydAccountVo getCashoutAccount(Long id) { + SysSydAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + SysSydVo vo = sydMapper.selectVoById(rtn.getSydId()); + rtn.setAccName(vo.getGsmc()); + rtn.setBankCard(vo.getBankCard()); + rtn.setKfd(vo.getKfd()); + rtn.setKfh(vo.getKfh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java new file mode 100644 index 0000000..912444c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.mapper.SysSydAccountSynMapper; +import org.dromara.payment.sys.service.ISysSydAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商账户同步Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydAccountSynServiceImpl implements ISysSydAccountSynService { + + private final SysSydAccountSynMapper baseMapper; + + /** + * 查询服务商账户同步 + */ + @Override + public SysSydAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商账户同步列表 + */ + @Override + public TableDataInfo queryPageList(SysSydAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商账户同步列表 + */ + @Override + public List queryList(SysSydAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, SysSydAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, SysSydAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), SysSydAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, SysSydAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增服务商账户同步 + */ + @Override + public Boolean insertByBo(SysSydAccountSynBo bo) { + SysSydAccountSyn add = MapstructUtils.convert(bo, SysSydAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商账户同步 + */ + @Override + public Boolean updateByBo(SysSydAccountSynBo bo) { + SysSydAccountSyn update = MapstructUtils.convert(bo, SysSydAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商账户同步 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java new file mode 100644 index 0000000..db48e57 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java @@ -0,0 +1,294 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.mapper.SysSydCashoutMapper; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Duration; +import java.util.*; +import java.util.function.Supplier; + +/** + * 服务商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydCashoutServiceImpl implements ISysSydCashoutService { + + private final SysSydCashoutMapper baseMapper; + + private final SysSydAccountMapper sydAccountMapper; + + private final ISysSydAccountService sydAccountService; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final SysSydMapper sydMapper; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final IMerBillService billService; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询服务商提现记录 + */ + @Override + public SysSydCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(SysSydCashoutBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商提现记录列表 + */ + @Override + public List queryList(SysSydCashoutBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydCashoutBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydCashout::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, SysSydCashout::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), SysSydCashout::getBusNo, bo.getBusNo()); + lqw.eq(bo.getAmount() != null, SysSydCashout::getAmount, bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), SysSydCashout::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), SysSydCashout::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSydCashout::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), SysSydCashout::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydCashout::getBankCard, bo.getBankCard()); + lqw.eq(bo.getPayStatus() != null, SysSydCashout::getPayStatus, bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, SysSydCashout::getPayTime, bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), SysSydCashout::getPayRemark, bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, SysSydCashout::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydCashout::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), SysSydCashout::getPassage, bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), SysSydCashout::getPayReceipt, bo.getPayReceipt()); + return lqw; + } + + /** + * 新增服务商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydCashoutBo bo) { + SysSydCashout add = MapstructUtils.convert(bo, SysSydCashout.class); + validEntityBeforeSave(add); + SysSydAccountVo vo = sydAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + billService.checkPayPassword(BusRole.SERVICE, vo.getSydId(), () -> { + SysSydVo syd = sydMapper.selectVoById(vo.getSydId()); + if(StringUtils.isBlank(syd.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(syd.getPayPassword()); + }); + String busDesc = "服务商提现"; + if(sydAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + add.setPayStatus(2l);//支付中 + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + Account bankAcc = new Account(); + bankAcc.setBankType(add.getKhh()); + bankAcc.setBankCard(add.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(add.getFr()); + bankAcc.setType((short)3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //服务商提现 + TranLog backLog = new TranLog(); + backLog.setBusType(5l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(add.getId()); + Result backRtn = accountService.applyTransfer(vo.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), add.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.SERVICE.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "服务商提现"; + SysSydCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(SysSydCashout::getId,vo.getId()) + .eq(SysSydCashout::getPayStatus,2) + .set(SysSydCashout::getPayStatus,3) + .set(SysSydCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + SysSydVo syd = sydMapper.selectVoById(vo.getSydId()); + SysSydFlows sydFlow = new SysSydFlows(2,vo.getSydId(),13, vo.getPassage(), null,tran.getTargetBankNo(), -tran.getAmount(), new Date(),vo.getAddBy(),"提现", null, vo.getId(), null, tlog.getTranNo(), 3, tran.getResult().intValue(), tlog.getSourceAccType(), vo.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + sydFlowsMapper.insertSelective(sydFlow); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(SysSydCashout::getId,vo.getId()) + .eq(SysSydCashout::getPayStatus,2) + .set(SysSydCashout::getPayStatus,4) + .set(SysSydCashout::getPayTime,new Date()) + .set(SysSydCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } + + /** + * 修改服务商提现记录 + */ + @Override + public Boolean updateByBo(SysSydCashoutBo bo) { + SysSydCashout update = MapstructUtils.convert(bo, SysSydCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java new file mode 100644 index 0000000..0b1a535 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java @@ -0,0 +1,113 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.payment.sys.mapper.SysSydConfigMapper; +import org.dromara.payment.sys.service.ISysSydConfigService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商配置Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydConfigServiceImpl implements ISysSydConfigService { + + private final SysSydConfigMapper baseMapper; + + /** + * 查询服务商配置 + */ + @Override + public SysSydConfigVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商配置列表 + */ + @Override + public TableDataInfo queryPageList(SysSydConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商配置列表 + */ + @Override + public List queryList(SysSydConfigBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydConfig::getSydId, bo.getSydId()); + lqw.eq(bo.getBegin() != null, SysSydConfig::getBegin, bo.getBegin()); + lqw.eq(bo.getEnd() != null, SysSydConfig::getEnd, bo.getEnd()); + lqw.eq(bo.getRate() != null, SysSydConfig::getRate, bo.getRate()); + lqw.eq(bo.getIsTaxCertificate() != null, SysSydConfig::getIsTaxCertificate, bo.getIsTaxCertificate()); + lqw.eq(bo.getCalStyle() != null, SysSydConfig::getCalStyle, bo.getCalStyle()); + return lqw; + } + + /** + * 新增服务商配置 + */ + @Override + public Boolean insertByBo(SysSydConfigBo bo) { + SysSydConfig add = MapstructUtils.convert(bo, SysSydConfig.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商配置 + */ + @Override + public Boolean updateByBo(SysSydConfigBo bo) { + SysSydConfig update = MapstructUtils.convert(bo, SysSydConfig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydConfig entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java new file mode 100644 index 0000000..c1bb8a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.convert.Convert; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.service.ISysSydFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商流水Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydFlowsServiceImpl implements ISysSydFlowsService { + + private final SysSydFlowsMapper baseMapper; + + /** + * 查询服务商流水 + */ + @Override + public SysSydFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商流水列表 + */ + @Override + public TableDataInfo queryPageList(SysSydFlowsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商流水列表 + */ + @Override + public List queryList(SysSydFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydFlows::getSydId, bo.getSydId()); + lqw.eq(bo.getBusType() != null, SysSydFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), SysSydFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), SysSydFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), SysSydFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, SysSydFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, SysSydFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, SysSydFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), SysSydFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), SysSydFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, SysSydFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, SysSydFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), SysSydFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, SysSydFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, SysSydFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, SysSydFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, SysSydFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), SysSydFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), SysSydFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, SysSydFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, SysSydFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, SysSydFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), SysSydFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), SysSydFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, SysSydFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), SysSydFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, SysSydFlows::getPayReceiptType, bo.getPayReceiptType()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(SysSydFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("ids"))){ + lqw.in(SysSydFlows::getId,StringUtils.splitTo(bo.getParams().get("ids").toString(), Convert::toLong)); + } + lqw.orderByDesc(SysSydFlows::getAddTime); + return lqw; + } + + /** + * 新增服务商流水 + */ + @Override + public Boolean insertByBo(SysSydFlowsBo bo) { + SysSydFlows add = MapstructUtils.convert(bo, SysSydFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商流水 + */ + @Override + public Boolean updateByBo(SysSydFlowsBo bo) { + SysSydFlows update = MapstructUtils.convert(bo, SysSydFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java new file mode 100644 index 0000000..ce895cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java @@ -0,0 +1,142 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.payment.sys.mapper.SysSydLogMapper; +import org.dromara.payment.sys.service.ISysSydLogService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商变动记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydLogServiceImpl implements ISysSydLogService { + + private final SysSydLogMapper baseMapper; + + /** + * 查询服务商变动记录 + */ + @Override + public SysSydLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商变动记录列表 + */ + @Override + public TableDataInfo queryPageList(SysSydLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商变动记录列表 + */ + @Override + public List queryList(SysSydLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydLogBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydLog::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysSydLog::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getGsmc()), SysSydLog::getGsmc, bo.getGsmc()); + lqw.eq(StringUtils.isNotBlank(bo.getKfd()), SysSydLog::getKfd, bo.getKfd()); + lqw.eq(StringUtils.isNotBlank(bo.getKfh()), SysSydLog::getKfh, bo.getKfh()); + lqw.eq(bo.getBankType() != null, SysSydLog::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydLog::getBankCard, bo.getBankCard()); + lqw.eq(bo.getJbsl() != null, SysSydLog::getJbsl, bo.getJbsl()); + lqw.eq(bo.getQuoteNum() != null, SysSydLog::getQuoteNum, bo.getQuoteNum()); + lqw.eq(bo.getAddTime() != null, SysSydLog::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydLog::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSydLog::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSydLog::getEditTime, bo.getEditTime()); + lqw.eq(bo.getProvinceId() != null, SysSydLog::getProvinceId, bo.getProvinceId()); + lqw.like(StringUtils.isNotBlank(bo.getProvinceName()), SysSydLog::getProvinceName, bo.getProvinceName()); + lqw.eq(bo.getCityId() != null, SysSydLog::getCityId, bo.getCityId()); + lqw.like(StringUtils.isNotBlank(bo.getCityName()), SysSydLog::getCityName, bo.getCityName()); + lqw.eq(bo.getCountyId() != null, SysSydLog::getCountyId, bo.getCountyId()); + lqw.like(StringUtils.isNotBlank(bo.getCountyName()), SysSydLog::getCountyName, bo.getCountyName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), SysSydLog::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSydLog::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrCardid()), SysSydLog::getFrCardid, bo.getFrCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getFrPhone()), SysSydLog::getFrPhone, bo.getFrPhone()); + lqw.like(StringUtils.isNotBlank(bo.getConName()), SysSydLog::getConName, bo.getConName()); + lqw.eq(StringUtils.isNotBlank(bo.getConPhone()), SysSydLog::getConPhone, bo.getConPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getConCardid()), SysSydLog::getConCardid, bo.getConCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getConEmail()), SysSydLog::getConEmail, bo.getConEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysSydLog::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBusiness()), SysSydLog::getBusiness, bo.getBusiness()); + lqw.eq(StringUtils.isNotBlank(bo.getAbridge()), SysSydLog::getAbridge, bo.getAbridge()); + lqw.eq(bo.getLimitAmount() != null, SysSydLog::getLimitAmount, bo.getLimitAmount()); + lqw.eq(bo.getSignMode() != null, SysSydLog::getSignMode, bo.getSignMode()); + lqw.eq(bo.getSignValidTime() != null, SysSydLog::getSignValidTime, bo.getSignValidTime()); + lqw.eq(bo.getLogTime() != null, SysSydLog::getLogTime, bo.getLogTime()); + return lqw; + } + + /** + * 新增服务商变动记录 + */ + @Override + public Boolean insertByBo(SysSydLogBo bo) { + SysSydLog add = MapstructUtils.convert(bo, SysSydLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商变动记录 + */ + @Override + public Boolean updateByBo(SysSydLogBo bo) { + SysSydLog update = MapstructUtils.convert(bo, SysSydLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商变动记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java new file mode 100644 index 0000000..869b3e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java @@ -0,0 +1,224 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.mapper.BusOperatorProductMapper; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.mapper.SysSydProductMapper; +import org.dromara.payment.sys.service.ISysSydProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务商产品Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydProductServiceImpl extends BaseService implements ISysSydProductService { + + private final SysSydProductMapper baseMapper; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + @Autowired + private BusOperatorProductMapper busOperatorProductMapper; + + @Autowired + private BusChannelProductMapper busChannelProductMapper; + + @Autowired + private BusMerchantProductMapper busMerchantProductMapper; + + /** + * 查询服务商产品 + */ + @Override + public SysSydProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商产品列表 + */ + @Override + public TableDataInfo queryPageList(SysSydProductBo bo, PageQuery pageQuery) { + Page result = baseMapper.queryPageList(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询服务商产品列表 + */ + @Override + public List queryList(SysSydProductBo bo) { + return baseMapper.queryList(bo); + } + + /** + * 新增服务商产品 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydProductBo bo) { + SysSydProduct add = MapstructUtils.convert(bo, SysSydProduct.class); + validEntityBeforeSave(add); + add.setNo(genNo(0,10)); + if(bo.getInvoiceItemList() != null){ + bo.setInvoiceItems(StreamUtils.join(bo.getInvoiceItemList(),ReProductInvoiceBo::getInvoiceTypeName)); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + if(bo.getInvoiceItemList() != null && bo.getInvoiceItemList().size() > 0){ + List invoiceItems = new ArrayList<>(); + for (ReProductInvoiceBo ibo:bo.getInvoiceItemList()) { + ReProductInvoice obj = MapstructUtils.convert(ibo,ReProductInvoice.class); + obj.setProType(bo.getBusType()); + obj.setProNo(bo.getNo()); + obj.setProId(add.getId()); + obj.setBusId(bo.getSydId()); + obj.setBusType(BusRole.SERVICE.getId()); + invoiceItems.add(obj); + } + reProductInvoiceMapper.insertBatch(invoiceItems); + } + } + return flag; + } + + /** + * 生成产品编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "P"+ RandomUtil.randomNumbers(10); + QueryWrapper lqw = Wrappers.query(); + lqw.eq("no",no); + SysSydProduct exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("产品编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改服务商产品 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysSydProductBo bo) { + SysSydProduct update = MapstructUtils.convert(bo, SysSydProduct.class); + validEntityBeforeSave(update); + SysSydProductVo selObj = this.baseMapper.selectVoById(bo.getId()); + if(selObj == null){ + this.invalidationParamsException("参数无效,无此产品"); + } + + BigDecimal minBigDecimal = this.baseMapper.selMinServiceChargeByproId(bo.getId()); + if(minBigDecimal != null ){ + + if(minBigDecimal.compareTo(bo.getSetingServiceCharge()) < 0){ + this.invalidationParamsException("产品费率不能大于"+minBigDecimal); + } + } + + reProductInvoiceMapper.delete(new LambdaQueryWrapper().eq(ReProductInvoice::getBusId,bo.getSydId()).eq(ReProductInvoice::getBusType,BusRole.SERVICE.getId())); + if(bo.getInvoiceItemList() != null && bo.getInvoiceItemList().size() > 0){ + bo.setInvoiceItems(StreamUtils.join(bo.getInvoiceItemList(),ReProductInvoiceBo::getInvoiceTypeName)); + List invoiceItems = new ArrayList<>(); + for (ReProductInvoiceBo ibo:bo.getInvoiceItemList()) { + ReProductInvoice obj = MapstructUtils.convert(ibo,ReProductInvoice.class); + obj.setProType(bo.getBusType()); + obj.setProNo(bo.getNo()); + obj.setProId(bo.getId()); + obj.setBusId(bo.getSydId()); + obj.setBusType(BusRole.SERVICE.getId()); + invoiceItems.add(obj); + } + reProductInvoiceMapper.insertBatch(invoiceItems); + }else{ + bo.setInvoiceItems(""); + } + + if(selObj.getInvoiceItems() == null || !selObj.getInvoiceItems().equals(bo.getInvoiceItems())){ + + this.busOperatorProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusOperatorProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusOperatorProduct::getProId, bo.getId())); + this.busChannelProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusChannelProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusChannelProduct::getProId, bo.getId())); + this.busMerchantProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusMerchantProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusMerchantProduct::getProId, bo.getId())); + } + + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public String upDown(Long id, Integer status) { + if(id == null || status == null){ + this.invalidationParamsException("参数无效"); + } + this.baseMapper.update(null,new LambdaUpdateWrapper().set(SysSydProduct::getProStatus,status).eq(SysSydProduct::getId,id)); + return "true"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java new file mode 100644 index 0000000..847c816 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java @@ -0,0 +1,536 @@ +package org.dromara.payment.sys.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.properties.PayPasswordProperties; +import org.dromara.payment.properties.PlatformProperties; +import org.dromara.payment.sys.domain.*; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.mapper.*; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.service.ISysSydService; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.*; +import java.util.function.Function; + +/** + * 服务商Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysSydServiceImpl implements ISysSydService { + + private final SysSydMapper baseMapper; + + private final SysSydLogMapper sydLogMapper; + + private final SysUnitMapper sysUnitMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydServiceTransactionImpl transactionImpl; + + private final BankAccountServiceTransactionImpl bankAccountTransactionImpl; + + private final SysSydConfigMapper sysSydConfigMapper; + @DubboReference + private RemoteAccountService accountService;//银行账户 + + private final SysSydSignContentMapper signContentDao;//结算中心协议dao + + private final SysSydAccountMapper sysSydAccountMapper; + + @DubboReference + private RemoteSmsService remoteSmsService; + + @DubboReference + private RemoteJzqService remoteJzqService; + + @Autowired + private PlatformProperties platformProperties; + + @DubboReference + private RemoteUserService remoteUserService; + + /** + * 查询服务商 + */ + @Override + public SysSydVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商列表 + */ + @Override + public TableDataInfo queryPageList(SysSydBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectSydList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商列表 + */ + @Override + public List queryList(SysSydBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysSyd::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getGsmc()), SysSyd::getGsmc, bo.getGsmc()); + lqw.eq(StringUtils.isNotBlank(bo.getKfd()), SysSyd::getKfd, bo.getKfd()); + lqw.eq(StringUtils.isNotBlank(bo.getKfh()), SysSyd::getKfh, bo.getKfh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), SysSyd::getKhhNo, bo.getKhhNo()); + lqw.eq(bo.getBankType() != null, SysSyd::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSyd::getBankCard, bo.getBankCard()); + lqw.eq(bo.getJbsl() != null, SysSyd::getJbsl, bo.getJbsl()); + lqw.eq(bo.getQuoteNum() != null, SysSyd::getQuoteNum, bo.getQuoteNum()); + lqw.eq(bo.getAddTime() != null, SysSyd::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSyd::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSyd::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSyd::getEditTime, bo.getEditTime()); + lqw.eq(bo.getProvinceId() != null, SysSyd::getProvinceId, bo.getProvinceId()); + lqw.like(StringUtils.isNotBlank(bo.getProvinceName()), SysSyd::getProvinceName, bo.getProvinceName()); + lqw.eq(bo.getCityId() != null, SysSyd::getCityId, bo.getCityId()); + lqw.like(StringUtils.isNotBlank(bo.getCityName()), SysSyd::getCityName, bo.getCityName()); + lqw.eq(bo.getCountyId() != null, SysSyd::getCountyId, bo.getCountyId()); + lqw.like(StringUtils.isNotBlank(bo.getCountyName()), SysSyd::getCountyName, bo.getCountyName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), SysSyd::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSyd::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrCardid()), SysSyd::getFrCardid, bo.getFrCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getFrPhone()), SysSyd::getFrPhone, bo.getFrPhone()); + lqw.like(StringUtils.isNotBlank(bo.getConName()), SysSyd::getConName, bo.getConName()); + lqw.eq(StringUtils.isNotBlank(bo.getConPhone()), SysSyd::getConPhone, bo.getConPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getConCardid()), SysSyd::getConCardid, bo.getConCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getConEmail()), SysSyd::getConEmail, bo.getConEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysSyd::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBusiness()), SysSyd::getBusiness, bo.getBusiness()); + lqw.eq(StringUtils.isNotBlank(bo.getAbridge()), SysSyd::getAbridge, bo.getAbridge()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), SysSyd::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, SysSyd::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, SysSyd::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.orderByDesc(SysSyd::getAddTime); + return lqw; + } + + + + + /** + * 新增服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydBo bo) throws Exception { + + String email = bo.getConEmail(); + String name = bo.getConName(); + Integer organizationType = 0; + Integer identificationType = 1; + String organizationRegNo = bo.getNsrSbh(); + String saveDir = "/www/wwwroot"; + // 保存的文件名 + String fileName = "downloaded_image.jpeg"; + File organizationRegImg = createFileFromURL(bo.getYyzz(), saveDir, fileName); + + + + String legalName = bo.getFr(); + String legalIdentityCard = bo.getFrCardid(); + String legalMobile = bo.getFrPhone(); + + String s = remoteJzqService.organizationCreate(email, name, organizationType, identificationType, organizationRegNo, + organizationRegImg, legalName, legalIdentityCard, legalMobile); + + JSONObject parse = JSONObject.parseObject(s); + if (parse.getString("success").equals("false")) { + throw new ServiceException(parse.getString("msg")); + } + + SysSyd add = MapstructUtils.convert(bo, SysSyd.class); + validEntityBeforeSave(add); + String no = genNo(0,10); + SysUnit sysUnit = new SysUnit(); + sysUnit.setNo(no); + sysUnit.setId(IdUtil.getSnowflakeNextId()); + sysUnit.setUnitType(BusRole.SERVICE.getId()); + sysUnit.setName(add.getGsmc()); + sysUnit.setCustNo(no.substring(1)); + sysUnitMapper.insert(sysUnit); + add.setId(sysUnit.getId()); + add.setNo(no); + add.setAddBy(bo.getAddBy()); + add.setAddTime(new Date()); + add.setEditer(bo.getAddBy()); + add.setEditTime(bo.getAddTime()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + + SysSydConfig sysSydConfig = new SysSydConfig(); + sysSydConfig.setSydId(add.getId()); + sysSydConfig.setAutoApprove(1); + sysSydConfig.setCreateTime(new Date()); + sysSydConfig.setCreateBy(LoginHelper.getUserId()); + sysSydConfigMapper.insert(sysSydConfig); + + + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(bo.getId()); + remoteUserBo.setBusNo(add.getNo()); + remoteUserBo.setRoleId(BusRole.SERVICE.getId()); + remoteUserBo.setRoleName(BusRole.SERVICE.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bo.getGsmc()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bo.getConPhone()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("S"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addUser(remoteUserBo); + + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.SERVICE.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(bo.getDomain(),remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + + return flag; + } + + + public static File createFileFromURL(String fileUrl, String saveDir, String fileName) throws Exception { + // 确保保存目录存在 + File savePath = new File(saveDir); + if (!savePath.exists()) { + savePath.mkdirs(); + } + + // 创建目标文件 + File file = new File(saveDir, fileName); + + // 从URL下载文件并保存到本地 + try (InputStream inputStream = new URL(fileUrl).openStream(); + FileOutputStream outputStream = new FileOutputStream(file)) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + return file; + } + + private void addUser(RemoteUserBo remoteUserBo){ + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("S"+StringUtils.randmNumber(5)); + this.addUser(remoteUserBo); + } + + } + + /** + * 生成服务商编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "S"+ RandomUtil.randomNumbers(5); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysSyd::getNo,no); + SysSyd exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("服务商编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysSydBo bo) { + SysSyd update = MapstructUtils.convert(bo, SysSyd.class); + validEntityBeforeSave(update); + update.setEditer(bo.getEditer()); + update.setEditTime(new Date()); + sysUnitMapper.update(new LambdaUpdateWrapper() + .set(SysUnit::getName, update.getGsmc()) + .eq(SysUnit::getId, update.getId())); + sydLogMapper.insertSysSydLog(update.getId(),new Date()); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSyd entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysSyd::getGsmc,entity.getGsmc()); + SysSyd exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || !entity.getId().equals(exists.getId()))){ + throw new ServiceException("服务商已存在"); + } + } + + /** + * 批量删除服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + sysUnitMapper.deleteBatchIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean creatSydXNnum(Long id, String gsmc) { + //服务商账户 + Map paraMap= new HashMap(); + + paraMap.put("sydId",id); + paraMap.put("accType",0); + paraMap.put("bankType",id); + + + Boolean sydRtn = creatXNnum(id,id,gsmc,BusRole.SERVICE.getId(),BusRole.PLATFORM.getId(), add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = sysSydAccountMapper.insertSysSydAccount(new SysSydAccount(null, add.getUnitId(), add.getAccId(), 0, add.getBankType(), add.getBankCard(), 0l, 0l, (long) 1, add.getAddTime(), + add.getKhh(),add.getLhh(),add.getName())); + return num > 0; + } + return true; + } + return false; + }, bankType -> { + List accs = sysSydAccountMapper.selectSysSydAccountBySydId(id, (short) 0, bankType); + return accs.size() > 0 ? accs.get(0).getBankCard() : null; + }); + //平台账户 + Boolean platformRtn = creatXNnum(id,0l,platformProperties.getKhm(),BusRole.PLATFORM.getId(),BusRole.PLATFORM.getId(), add -> { + if(add != null) { + return true; + } + return false; + }, bankType -> { + List accs = accountsMapper.selectList(new LambdaQueryWrapper() + .eq(BusAccounts::getSydId,id) + .eq(BusAccounts::getUnitId,0) + .eq(BusAccounts::getIsDefault,1) + .eq(BusAccounts::getBankType,bankType)); + return accs.size() > 0 ? accs.get(0).getBankCard() : null; + }); + return sydRtn && platformRtn; + } + + @Override + public Boolean creatXNnum(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun, Function existsFun) { + String failBank = ""; + try { + try { + transactionImpl.addZhaoShangAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "招商银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addJiaoTongAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun,existsFun); + } catch (Exception e) { + String bankType = "交通银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addZhiFuBaoAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "支付宝"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addMinShengAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "民生银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + if (StringUtils.isNotEmpty(failBank)) { + throw new ServiceException("开通服务费账户失败[" + failBank + "]"); + } + return true; + } catch (Exception e) { + String msgStr = "开虚拟户失败!"; + log.error(msgStr, e); + if (e instanceof ServiceException) { + throw new ServiceException(e.getMessage()); + } else { + throw new ServiceException(msgStr); + } + } + } + + @Override + public Map valiConfig(Long sydId, String passage) { + if (StringUtils.isBlank(passage)) { + throw new ServiceException("bankType不能为空"); + } + try { + return bankAccountTransactionImpl.existsBank(sydId, passage); + } catch (Exception e) { + String msgStr = "验证银行类型是否可用出错:("+sydId+","+passage+")"; + log.error(msgStr,e); + } + return null; + } + + @Override + public SysSydSignContent getWorkerSignInfo(int sydId) { + try { + SysSydSignContent rtn = signContentDao.selectByPrimaryKey(sydId); + if (rtn != null) { + SysSyd syd = baseMapper.selectSysSydById(Long.parseLong(sydId+"")); + rtn.setSignMode(syd.getSignMode()); + rtn.setSignValidTime(syd.getSignValidTime()); + } + return rtn; + } catch (Exception e) { + String msgStr = "查询结算中心的签约内容出错:("+sydId+")"; + log.error(msgStr,e); + } + return null; + } + + @Override + public Boolean saveWorkerSignInfo(SysSydSignContent sign) { + try { + sign.setEditTime(new Date()); + transactionImpl.saveWorkerSignInfo(sign); + return true; + } catch (Exception e) { + String msgStr = "保存结算中心的自雇者签约信息出错:("+ JSONObject.toJSONString(sign)+")"; + log.error(msgStr,e); + if(e instanceof ServiceException) + throw new ServiceException(e.getMessage()); + } + return false; + } + + @Override + public SignZhifubao getSignInfo(Long sydId, String passage) { + try { + SysSyd syd = baseMapper.selectSysSydById(Long.parseLong(sydId+"")); + if (syd == null) { + throw new ServiceException("结算中心已不存在"); + } + Result signRtn = accountService.getSignInfo(syd.getId(), syd.getGsmc(), passage); + if (signRtn.hasError()) { + throw new RuntimeException(signRtn.getResult()); + }else if (signRtn.hasTip()) { + throw new ServiceException(signRtn.getResult()); + }else if (signRtn.getRtnData() == null) { + throw new ServiceException("该结算中心无需签约"); + } + return signRtn.getRtnData(); + } catch (Exception e) { + String msgStr = "获取结算中心的签约信息出错:("+sydId+","+passage+")"; + log.error(msgStr,e); + if(e instanceof ServiceException) + throw new ServiceException(e.getMessage()); + } + return null; + } + + @Override + public List selectSydByMerId(Long merId) { + return baseMapper.selectSydByMerId(merId); + } + + + + @Override + public List getSydByUserName(String userName) { + List rtn = null; + RemoteSysUserVo user = remoteUserService.selectUserByName(userName); + if(user != null && user.getCurRoleId() == BusRole.MERCHANT.getId()){ + rtn = baseMapper.selectSydByMerId(user.getBusId()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java new file mode 100644 index 0000000..5c96360 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java @@ -0,0 +1,206 @@ +package org.dromara.payment.sys.service.impl; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.mapper.SysSydSignContentMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.ResultCodeEnum; +import org.dromara.system.api.RemoteOrderNumService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +/** + * 税源地Service业务层处理 + * + * @author ruoyi + * @date 2021-08-18 + */ +@Service +@Slf4j +public class SysSydServiceTransactionImpl +{ + @DubboReference + private RemoteAccountService accountService; + + @Autowired + private BusAccountsMapper accountsMapper; + + @Autowired + private SysSydMapper sydDao; + + @Autowired + private SysSydSignContentMapper signDao; + + @Autowired + private BankAccountServiceTransactionImpl bankAccountService;//银行账户业务 + + + @DubboReference + private RemoteOrderNumService remoteOrderNumService; + + private String getOrderKey(int roleType){ + + if(BusRole.SERVICE.getId() == roleType){ + return "service"; + }else if(BusRole.MERCHANT.getId() == roleType){ + return "merchant"; + }else if(BusRole.OPERATOR.getId() == roleType){ + return "operator"; + }else if(BusRole.PLATFORM.getId() == roleType){ + return "platform"; + }else{ + return "default"; + } + + + } + + @Transactional + public void addZhaoShangAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "招商银行"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开招商银行虚拟户 + Long code = this.remoteOrderNumService.getOrderNum(sydId+this.getOrderKey(roleType),5); + log.info(roleType +"- 生成编号:"+code); + if(code == null){ + throw new ServiceException("生成编号出错"); + } + Result addAccount = accountService.addAccount(sydId, roleType, unitId,gsmc,bankType,code); + if(addAccount !=null&&addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()){ + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(), + rtnData.getBankName(), rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + }else { + throw new ServiceException("招商银行开虚拟户失败:"+addAccount.getResult()); + } + } + } + + @Transactional + public void addZhiFuBaoAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "支付宝"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开支付宝记账本 + Result addAccount = accountService.addAccount(sydId,roleType, unitId,gsmc,bankType,null); + if(addAccount !=null&&addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()){ + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + }else { + throw new ServiceException("支付宝开虚拟户失败:"+addAccount.getResult()); + } + } + } + + @Transactional + public void addJiaoTongAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun, Function existsFun) { + //开交通银行虚拟户 + Map configMap = bankAccountService.existsBank(sydId, "交通银行"); + if (configMap != null) { + Account bankAcc = new Account(); + bankAcc.setBankType("交通银行"); + bankAcc.setBankCard(configMap.get("jiaotong_cloud_acc1")); + bankAcc.setBankArgNo(configMap.get("jiaotong_cloud_acc1_busi_no")); + bankAcc.setUnitId(sydId); + bankAcc.setName(configMap.get("jiaotong_super_acc_name")); + bankAcc.setType((short)1);//1:云账户 + Result addAccount = accountService.addAccount(bankAcc); + if (addAccount.hasError() || addAccount.hasTip() || addAccount.getRtnData() == null) { + throw new RuntimeException("交通银行开虚拟户失败:"+addAccount.getResult()); + }else { + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + String existsCard = existsFun.apply(rtnData.getBankTypeName()); + if (StringUtils.isBlank(existsCard)) { + bankAccountService.useAccount(new AccAccounts(rtnData.getBankTypeName(), rtnData.getBankCard(), (short) roleType, unitId, gsmc, rtnData.getBankArgNo())); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + if (!saveFun.apply(add)) { + throw new RuntimeException("不允许更换结算云账户"); + } + } else { + if (!existsCard.equals(rtnData.getBankCard())) { + throw new RuntimeException("不允许更换结算云账户"); + } + } + } + } + } + + @Transactional + public void addMinShengAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "民生银行"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开招商银行虚拟户 + SysSyd syd = sydDao.selectSysSydById(sydId); + String bindAcctNo = syd.getBankCard(); + String bindAcctName = configMap.get("minsheng_bank_acctName"); + Result addAccount = accountService.addAccount(sydId, roleType, unitId, gsmc, bankType, bindAcctNo, bindAcctName,null); + if (addAccount != null && addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()) { + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + } else { + throw new ServiceException(bankType + "开虚拟户失败:" + addAccount.getResult()); + } + } + } + + @Transactional + public void saveWorkerSignInfo(SysSydSignContent sign) { + SysSyd syd = new SysSyd(); + syd.setId(sign.getId().longValue()); + syd.setSignMode(sign.getSignMode()); + syd.setSignValidTime(sign.getSignValidTime()); + sydDao.updateSysSyd(syd); + SysSydSignContent old = signDao.selectByPrimaryKey(sign.getId()); + if (old != null) { + signDao.updateByPrimaryKeySelective(sign); + } else { + signDao.insertSelective(sign); + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java new file mode 100644 index 0000000..f148d24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.payment.sys.mapper.SysSydSignContentMapper; +import org.dromara.payment.sys.service.ISysSydSignContentService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商协议内容Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydSignContentServiceImpl implements ISysSydSignContentService { + + private final SysSydSignContentMapper baseMapper; + + /** + * 查询服务商协议内容 + */ + @Override + public SysSydSignContentVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商协议内容列表 + */ + @Override + public TableDataInfo queryPageList(SysSydSignContentBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商协议内容列表 + */ + @Override + public List queryList(SysSydSignContentBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydSignContentBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), SysSydSignContent::getContent, bo.getContent()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSydSignContent::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSydSignContent::getEditTime, bo.getEditTime()); + return lqw; + } + + /** + * 新增服务商协议内容 + */ + @Override + public Boolean insertByBo(SysSydSignContentBo bo) { + SysSydSignContent add = MapstructUtils.convert(bo, SysSydSignContent.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId().longValue()); + } + return flag; + } + + /** + * 修改服务商协议内容 + */ + @Override + public Boolean updateByBo(SysSydSignContentBo bo) { + SysSydSignContent update = MapstructUtils.convert(bo, SysSydSignContent.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydSignContent entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商协议内容 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java new file mode 100644 index 0000000..3a61edc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java @@ -0,0 +1,165 @@ +package org.dromara.payment.sys.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.mapper.SysUnitMapper; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.ResultCodeEnum; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 单位基础信息Service业务层处理 + * + * @author LionLi + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysUnitServiceImpl implements ISysUnitService { + + private final SysUnitMapper baseMapper; + + private RemoteConfigService configService; + + /** + * 查询单位基础信息 + */ + @Override + public SysUnitVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询单位基础信息列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位基础信息列表 + */ + @Override + public List queryList(SysUnitBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getName()), SysUnit::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysUnit::getNo, bo.getNo()); + lqw.eq(bo.getUnitType() != null, SysUnit::getUnitType, bo.getUnitType()); + lqw.eq(StringUtils.isNotBlank(bo.getCustNo()), SysUnit::getCustNo, bo.getCustNo()); + return lqw; + } + + /** + * 新增单位基础信息 + */ + @Override + public Boolean insertByBo(SysUnitBo bo) { + SysUnit add = MapstructUtils.convert(bo, SysUnit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位基础信息 + */ + @Override + public Boolean updateByBo(SysUnitBo bo) { + SysUnit update = MapstructUtils.convert(bo, SysUnit.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnit entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位基础信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List getConfGroupByUnit(Long unit_id, String class_alias) { + try { + Result> result = configService.getConfGroupByUnit(unit_id,class_alias); + if(result.getRtnCode()== ResultCodeEnum.SUCCESS.Code()) { + return result.getRtnData(); + } + }catch(Exception ex) { + String msgStr = "获取单位配置大类下面的组信息异常"; + log.error(msgStr,ex); + } + return null; + } + + @Override + public List getConfDetailByUnit(Long unit_id, String conf_group) { + try { + Result> result = configService.getConfDetailByUnit(unit_id,conf_group); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + return result.getRtnData(); + } + }catch(Exception ex) { + String msgStr = "根据配置组查询单位配置项明细异常"; + log.error(msgStr,ex); + } + return null; + } + + @Override + public Boolean editConfDetail(List lendReco) { + try { + Result result = configService.editConfDetail(lendReco); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + if(result.getRtnData()) { + return true; + } + } + }catch(Exception ex) { + String msgStr = "编辑单位配置项明细异常"; + log.error(msgStr,ex); + } + return false; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java new file mode 100644 index 0000000..f901d4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java @@ -0,0 +1,177 @@ +package org.dromara.payment.task.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.service.IMerTaskService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 任务 + * 前端访问路由地址为:/payment/task + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/task") +public class MerTaskController extends BaseController { + + private final IMerTaskService merTaskService; + + /** + * 查询任务列表 商户角色 查看自己发起得; 运营商 查询自己得; 服务商接口 + */ +// @SaCheckPermission("payment:task:list") + @GetMapping("/list") + public TableDataInfo list(MerTaskBo bo, PageQuery pageQuery) { + return merTaskService.queryPageList(bo, pageQuery); + } + + /** + * @description 运营商审核列表, 服务商审核列表 + * @author wuchuang + * @param + * @return + * @time 2024/5/17 9:40 + */ +// @SaCheckPermission("payment:task:checkList") + @GetMapping("/checkList") + public TableDataInfo checkList(MerTaskBo bo, PageQuery pageQuery) { + return merTaskService.queryCheckList(bo, pageQuery); + } + + + /** + * 获取任务详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:task:query") + @GetMapping("/{id}") + public R queryById(@NotNull(message = "主键不能为空") + @PathVariable Long id, PageQuery pageQuery) { + return R.ok(merTaskService.queryById(id,pageQuery)); + } + + /** + * 新增任务 + */ +// @SaCheckPermission("payment:task:add") + @Log(title = "任务新建", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.insertByBo(bo)); + } + + /** + * 修改任务 发布上线接口 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "商户编辑、发布", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateByBo(bo)); + } + + /** + * 修改基本信息 服务商 运营商 角色使用 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务修改信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/editInfo") + public R editInfo(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateInfoByBo(bo)); + } + + + /** + * 任务审核 提交 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务审核", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/check") + public R check(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.checkInfoByBo(bo)); + } + + + /** + * 商户驳回提交 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "被驳回后提交", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/rejectCommit") + public R rejectCommit(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.rejectCommitByBo(bo)); + } + + + @GetMapping("/queryList") + public R> queryList(MerTaskBo bo) { + return R.ok(merTaskService.queryList(bo)); + } + + /** + * 上架下架 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务上架下架", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/ups") + public R ups(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateStateByBo(bo)); + } + + + /** + * 导出任务列表 + */ + @SaCheckPermission("payment:task:export") + @Log(title = "任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaskBo bo, HttpServletResponse response) { + List list = merTaskService.queryList(bo); + ExcelUtil.exportExcel(list, "任务", MerTaskVo.class, response); + } + + + /** + * 删除任务 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:task:remove") + @Log(title = "任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaskService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java new file mode 100644 index 0000000..44e3a4d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java @@ -0,0 +1,144 @@ +package org.dromara.payment.task.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 任务的报名 + * 前端访问路由地址为:/payment/taskEnroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taskEnroll") +public class MerTaskEnrollController extends BaseController { + + private final IMerTaskEnrollService merTaskEnrollService; + + /** + * 查询任务的报名列表 + */ +// @SaCheckPermission("payment:taskEnroll:list") + @GetMapping("/list") + public TableDataInfo list(MerTaskEnrollBo bo, PageQuery pageQuery) { + return merTaskEnrollService.queryPageList(bo, pageQuery); + } + + /** + * @description 交付查询 成功接单的用户 + * @author wuchuang + * @param + * @return + * @time 2024/5/23 16:12 + */ + // @SaCheckPermission("payment:taskEnroll:successlist") + @GetMapping("/successlist") + public TableDataInfo successlist(MerTaskEnrollBo bo, PageQuery pageQuery) { + return merTaskEnrollService.queryPageSuccessList(bo, pageQuery); + } + + /** + * 获取完工报告 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:taskEnroll:query") + @GetMapping("/queryConfirmation") + public R queryConfirmation(@RequestParam(value = "id", required = true) Long id) { + return R.ok(merTaskEnrollService.queryById(id)); + } + + + /** + * 审核 竞标人 + */ +// @SaCheckPermission("payment:taskEnroll:check") + @Log(title = "任务审核竞标人", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/check") + public R check(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.checkEnrollByBo(bo)); + } + + /** + * 验收 + */ +// @SaCheckPermission("payment:taskEnroll:acceptance") + @Log(title = "任务验收", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/acceptance") + public R acceptance(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.acceptanceEnrollByBo(bo)); + } + + + /** + * 导出任务的报名列表 + */ + @SaCheckPermission("payment:taskEnroll:export") + @Log(title = "任务的报名", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaskEnrollBo bo, HttpServletResponse response) { + List list = merTaskEnrollService.queryList(bo); + ExcelUtil.exportExcel(list, "任务的报名", MerTaskEnrollVo.class, response); + } + + + + /** + * 新增任务的报名 + */ + @SaCheckPermission("payment:taskEnroll:add") + @Log(title = "任务的报名", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.insertByBo(bo)); + } + + /** + * 修改任务的报名 + */ + @SaCheckPermission("payment:taskEnroll:edit") + @Log(title = "任务的报名", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.updateByBo(bo)); + } + + /** + * 删除任务的报名 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:taskEnroll:remove") + @Log(title = "任务的报名", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaskEnrollService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java new file mode 100644 index 0000000..85499a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java @@ -0,0 +1,273 @@ +package org.dromara.payment.task.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 任务对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task") +public class MerTask extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + /** + * 所属行业 + */ + private String industry; + + /** + * 所属行业 + */ + private String industryName; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 报名截至日期 + */ + private Date jiezhiDate; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + private Date beginDate; + + /** + * 任务结束日期 + */ + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + + private String itemTypeId; + + private String taskTypeId; + + private String itemTypeName; + + private String taskTypeName; + + private String itemId; + + private String taskId; + + private Long ossId; + + private String url; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java new file mode 100644 index 0000000..2884db0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java @@ -0,0 +1,26 @@ +package org.dromara.payment.task.domain; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; + +import java.util.List; + +/** + * @Title MerTaskDetail + * @Description + * @Author wuchuang + * @Date 2024/5/17 14:40 + */ +@Data +public class MerTaskDetail { + + private MerTaskVo merTask; + + private List logRecords; + + private Page enrolls; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java new file mode 100644 index 0000000..11dec83 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java @@ -0,0 +1,128 @@ +package org.dromara.payment.task.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 任务的报名对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task_enroll") +public class MerTaskEnroll extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public MerTaskEnroll(){} + + public MerTaskEnroll(String no, String taskNo, Long taskClassify, Long taskId, Long workId, Long verifyStatus, String verifyBy, Date verifyTime) { + this.no = no; + this.taskNo = taskNo; + this.taskClassify = taskClassify; + this.taskId = taskId; + this.workId = workId; + this.verifyStatus = verifyStatus; + this.verifyBy = verifyBy; + this.verifyTime = verifyTime; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long taskClassify; + + private Long cost; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java new file mode 100644 index 0000000..4c216ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java @@ -0,0 +1,277 @@ +package org.dromara.payment.task.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 任务业务对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTask.class, reverseConvertGenerate = false) +public class MerTaskBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jiezhiDate; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 所属行业 + */ + private String industry; + + private String industryName; + + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date beginDate; + + public Date getEndDate() { + if(this.endDate != null){ + return DateUtils.addOneDay(this.endDate); + } + return endDate; + } + + /** + * 任务结束日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + private List taskStatusList; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 商户名称 + */ + private String merName; + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + private Long ossId; + + private String url; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java new file mode 100644 index 0000000..8e92844 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.task.domain.bo; + +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 任务的报名业务对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaskEnroll.class, reverseConvertGenerate = false) +public class MerTaskEnrollBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + + private Long[] ids; + + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java new file mode 100644 index 0000000..ba1754a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.task.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.task.domain.RemoteMerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 任务的报名Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerTaskEnrollVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java new file mode 100644 index 0000000..718459f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.task.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.task.domain.RemoteMerTaskVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 任务Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerTaskVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java new file mode 100644 index 0000000..401a29f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java @@ -0,0 +1,168 @@ +package org.dromara.payment.task.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.task.domain.MerTaskEnroll; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaskEnroll.class) +public class MerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + private Long cost; + + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String no; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + + private String name; + + private String phone; + + private String cardId; + + private Integer isHide; + + public String getPhone() { + + if(isHide != null){ + return StringUtils.phoneHide(phone); + } + return phone; + + } + + public String getCardId() { + if(isHide != null){ + return StringUtils.idcardHide(cardId); + } + return cardId; + } + + /** + * 任务id + */ + @ExcelProperty(value = "任务id") + private Long taskId; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 自雇者微信openid + */ + @ExcelProperty(value = "自雇者微信openid") + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @ExcelProperty(value = "竞标状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:竞标中,2=:竞标失败,3=:竞标成功") + private Long verifyStatus; + + /** + * 选定审核人 + */ + @ExcelProperty(value = "选定审核人") + private String verifyBy; + + /** + * 选定审核时间 + */ + @ExcelProperty(value = "选定审核时间") + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @ExcelProperty(value = "完工状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未完成,1=:已完成,2=:验收驳回,3=:验收通过") + private Integer taskStatus; + + /** + * 验收备注 + */ + @ExcelProperty(value = "验收备注") + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @ExcelProperty(value = "结算状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待结算,1=:已结算") + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @ExcelProperty(value = "任务确认书文件地址") + private String taskConfirmFile; + + /** + * 交付内容 + */ + @ExcelProperty(value = "交付内容") + private String taskDesc; + + /** + * 交付图片 + */ + @ExcelProperty(value = "交付图片") + private String taskPic; + + /** + * 报名时间 + */ + @ExcelProperty(value = "报名时间") + private Date addTime; + + + private String workerName; + + @ExcelIgnore + private Integer payStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java new file mode 100644 index 0000000..9c821e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java @@ -0,0 +1,329 @@ +package org.dromara.payment.task.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.task.domain.MerTask; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务视图对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTask.class) +public class MerTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + @ExcelProperty(value = "项目类型:", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:派单、2:抢单") + private Long classify; + + /** + * 项目编码 + */ + @ExcelProperty(value = "项目编码") + private String no; + + /** + * 所属行业 + */ + private String industryName; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 报名截至日期 + */ + private Date jiezhiDate; + + /** + * 项目标题 + */ + @ExcelProperty(value = "项目标题") + private String name; + + @ExcelProperty(value = "服务商名称") + private String gsmc; + + + @ExcelProperty(value = "商户名称") + private String merchantName; + + /** + * 最小项目总金额(分) + */ + @ExcelProperty(value = "最小项目总金额(分)") + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + @ExcelProperty(value = "最大项目总金额(分),用于派单任务") + private Long costMax; + + /** + * 所属行业 + */ + @ExcelProperty(value = "所属行业") + private String industry; + + /** + * 用工人数(0:不限) + */ + @ExcelProperty(value = "用工人数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不限") + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + @ExcelProperty(value = "任务费用/人(众包任务) 应得(分)") + private Long costUnit; + + /** + * 任务开始日期 + */ + @ExcelProperty(value = "任务开始日期") + private Date beginDate; + + /** + * 任务结束日期 + */ + @ExcelProperty(value = "任务结束日期") + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + @ExcelProperty(value = "上架状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架、2:下架") + private Integer status; + + /** + * 上线时间 + */ + @ExcelProperty(value = "上线时间") + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + @ExcelProperty(value = "是否自动下架", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + @ExcelProperty(value = "项目状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待发布,1=:发布上线,2=:平台审核成功,3=:平台审核拒绝,4=:服务商接包,5=:服务商拒绝接单,6=:任务发布,7=:任务开始,8=:任务结束") + private Integer taskStatus; + + /** + * 提交审核时间 + */ + @ExcelProperty(value = "提交审核时间") + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + @ExcelProperty(value = "运营商审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待提交,1=:待审核、2:审核未通过、3:审核通过,4:审核中") + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + @ExcelProperty(value = "运营商审核时间") + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + @ExcelProperty(value = "运营商审核人") + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + @ExcelProperty(value = "运营商驳回原因") + private String opVerifyReason; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozenAmount; + + /** + * 实发金额 + */ + @ExcelProperty(value = "实发金额") + private Long relAmount; + + /** + * 最新结算时间 + */ + @ExcelProperty(value = "最新结算时间") + private Date relAmountTime; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + @ExcelProperty(value = "是否三方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isOut; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Integer busType; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + @ExcelProperty(value = "结算中心审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待提交,1=:待审核、2:审核未通过、3:审核通过,4:审核中") + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + @ExcelProperty(value = "结算中心审核时间") + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + @ExcelProperty(value = "结算中心审核人") + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + @ExcelProperty(value = "结算中心驳回原因") + private String sydVerifyReason; + + + //运营商 + private String opName; + + private Long ossId; + + private String url; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java new file mode 100644 index 0000000..376f60a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java @@ -0,0 +1,36 @@ +package org.dromara.payment.task.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 任务的报名Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskEnrollMapper extends BaseMapperPlus { + /** + * 修改代发批次结算中的结算状态 + * @param billId 代发批次id + * @param sourceSettlementStatus 源结算状态 + * @param settlementStatus 结算状态 + * @return + */ + public Integer updateSettlementStatusByBillId(@Param("billId") long billId,@Param("sourceSettlementStatus") int sourceSettlementStatus, @Param("settlementStatus") int settlementStatus); + + Page selectPageList(@Param("page") Page build, @Param("ew") Wrapper lqw); + + int updateTaskEnrollCheckStatusSuccess(MerTaskEnrollBo bo); + + void updateTaskEnrollCheckStatusFailed(MerTaskEnrollBo bo); + + int updateTaskEnrollTaskStatus(MerTaskEnrollBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java new file mode 100644 index 0000000..232a7c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java @@ -0,0 +1,24 @@ +package org.dromara.payment.task.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 任务Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskMapper extends BaseMapperPlus { + + + Page selectPageList(@Param("page") Page build, @Param("ew") QueryWrapper lqw); + + MerTaskVo selectMerTaskById(@Param("id") Long id); + + int updateEndById(MerTask task); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java new file mode 100644 index 0000000..166529a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java @@ -0,0 +1,55 @@ +package org.dromara.payment.task.service; + +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 任务的报名Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerTaskEnrollService { + + /** + * 查询任务的报名 + */ + MerTaskEnrollVo queryById(Long id); + + /** + * 查询任务的报名列表 + */ + TableDataInfo queryPageList(MerTaskEnrollBo bo, PageQuery pageQuery); + + /** + * 查询任务的报名列表 + */ + List queryList(MerTaskEnrollBo bo); + + /** + * 新增任务的报名 + */ + Boolean insertByBo(MerTaskEnrollBo bo); + + /** + * 修改任务的报名 + */ + Boolean updateByBo(MerTaskEnrollBo bo); + + /** + * 校验并批量删除任务的报名信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Boolean checkEnrollByBo(MerTaskEnrollBo bo); + + TableDataInfo queryPageSuccessList(MerTaskEnrollBo bo, PageQuery pageQuery); + + Boolean acceptanceEnrollByBo(MerTaskEnrollBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java new file mode 100644 index 0000000..75036de --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java @@ -0,0 +1,66 @@ +package org.dromara.payment.task.service; + +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 任务Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerTaskService { + + /** + * 查询任务 + */ + MerTaskDetail queryById(Long id, PageQuery pageQuery); + + /** + * 查询任务列表 + */ + TableDataInfo queryPageList(MerTaskBo bo, PageQuery pageQuery); + + /** + * @description 项目审核列表 + * @author wuchuang + * @param + * @return + * @time 2024/5/17 9:41 + */ + TableDataInfo queryCheckList(MerTaskBo bo, PageQuery pageQuery); + + + /** + * 新增任务 + */ + Boolean insertByBo(MerTaskBo bo); + + /** + * 修改任务 + */ + Boolean updateByBo(MerTaskBo bo); + + /** + * 校验并批量删除任务信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + Boolean updateStateByBo(MerTaskBo bo); + + Boolean updateInfoByBo(MerTaskBo bo); + + Boolean checkInfoByBo(MerTaskBo bo); + + Boolean rejectCommitByBo(MerTaskBo bo); + + List queryList(MerTaskBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java new file mode 100644 index 0000000..dd53b23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java @@ -0,0 +1,298 @@ +package org.dromara.payment.task.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 任务的报名Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +public class MerTaskEnrollServiceImpl implements IMerTaskEnrollService { + + @Resource + private final MerTaskEnrollMapper baseMapper; + + @Resource + private final MerTaskMapper merTaskMapper; + + @Resource + private final BusOperLogMapper busOperLogMapper; + + @Resource + private final UserWorkerBusinessMapper userWorkerBusinessMapper; + + /** + * 查询任务的报名 + */ + @Override + public MerTaskEnrollVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询任务的报名列表 + */ + @Override + public TableDataInfo queryPageList(MerTaskEnrollBo bo, PageQuery pageQuery) { + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + /** + * 查询任务的报名列表 + */ + @Override + public TableDataInfo queryPageSuccessList(MerTaskEnrollBo bo, PageQuery pageQuery) { + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + bo.setVerifyStatus(Long.valueOf(3)); + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + @Override + @Transactional + public Boolean checkEnrollByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + if(null == bo.getIds() || bo.getIds().length == 0){ + throw new IllegalArgumentException("子项目ID不能为空"); + } + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + bo.setVerifyBy(LoginHelper.getUsername()); + baseMapper.updateTaskEnrollCheckStatusFailed(bo); + MerTask task = new MerTask(); + task.setId(bo.getTaskId()); + task.setTaskStatus(7); + merTaskMapper.updateById(task); + BusOperLog log = new BusOperLog("任务开始", BusRole.getRole(LoginHelper.getBusRole()), bo.getTaskId(), 1); + busOperLogMapper.insert(log); + this.addUserWorkerBiz(bo); + return baseMapper.updateTaskEnrollCheckStatusSuccess(bo) > 0; + } + + private void addUserWorkerBiz(MerTaskEnrollBo bo){ + + MerTaskVo taskVo = this.merTaskMapper.selectMerTaskById(bo.getTaskId()); + int busType = taskVo.getBusType(); + long sydId = taskVo.getSydId(); + long merId = taskVo.getMerId(); + + Map paraMap = new HashMap(); + paraMap.put("merId",merId); + paraMap.put("sydId",sydId); + paraMap.put("busType",busType); + paraMap.put("workIds",bo.getIds()); + + List uwList = this.userWorkerBusinessMapper.selUserWorkBizByCon(paraMap); + Map map = uwList.stream() + .collect(Collectors.toMap(UserWorkerBusinessVo::getWorkId, obj -> obj)); + + List uwbList = new ArrayList<>(); + for(Long wordId: bo.getIds()){ + if(map.get(wordId) == null){ + UserWorkerBusiness uwb = new UserWorkerBusiness(); + uwb.setWorkId(wordId); + uwb.setBusType(busType); + uwb.setMerId(merId); + uwb.setSydId(sydId); + uwb.setMerNo(taskVo.getMerNo()); + uwb.setSydNo(taskVo.getSydNo()); + uwb.setOpId(taskVo.getOpId()); + uwb.setOpNo(taskVo.getOpNo()); + uwb.setChannelId(taskVo.getChannelId()); + uwb.setChannelNo(taskVo.getChannelNo()); + uwb.setSignStatus(0); + uwb.setCreateTime(new Date()); + uwb.setCreateBy(LoginHelper.getUserId()); + uwbList.add(uwb); + } + } + if(!uwbList.isEmpty()){ + this.userWorkerBusinessMapper.insertBatch(uwbList); + } + } + + /** + * 查询任务的报名列表 + */ + @Override + public Boolean acceptanceEnrollByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + if(null == bo.getId() ){ + throw new IllegalArgumentException("子项目ID不能为空"); + } + + if(null == bo.getTaskStatus() ){ + throw new IllegalArgumentException("完工状态不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + + boolean result = baseMapper.updateTaskEnrollTaskStatus(bo) > 0; + + if(3 == bo.getTaskStatus()){ + //判断是否项目结束 + MerTask task = new MerTask(); + task.setId(bo.getTaskId()); + + if(merTaskMapper.updateEndById(task) > 0){ + BusOperLog log = new BusOperLog("任务结束", BusRole.getRole(LoginHelper.getBusRole()), bo.getTaskId(), 1); + busOperLogMapper.insert(log); + } + } + return result; + } + + + /** + * 查询任务的报名列表 + */ + @Override + public List queryList(MerTaskEnrollBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper2(MerTaskEnrollBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + + lqw.eq(bo.getId() != null, "mer_task_enroll.id", bo.getId()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "mer_task_enroll.no", bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "mer_task_enroll.task_no", bo.getTaskNo()); + lqw.eq(bo.getTaskId() != null, "mer_task_enroll.task_id", bo.getTaskId()); + lqw.eq(bo.getWorkId() != null, "mer_task_enroll.work_id", bo.getWorkId()); + lqw.eq(bo.getVerifyStatus() != null, "mer_task_enroll.verify_status", bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "mer_task_enroll.verify_by", bo.getVerifyBy()); + lqw.eq(bo.getTaskStatus() != null, "mer_task_enroll.task_status", bo.getTaskStatus()); + lqw.eq(bo.getSettlementStatus() != null, "mer_task_enroll.settlement_status", bo.getSettlementStatus()); + lqw.eq(bo.getAddTime() != null, "mer_task_enroll.add_time", bo.getAddTime()); + return lqw; + } + + private LambdaQueryWrapper buildQueryWrapper(MerTaskEnrollBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), MerTaskEnroll::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), MerTaskEnroll::getTaskNo, bo.getTaskNo()); + lqw.eq(bo.getTaskId() != null, MerTaskEnroll::getTaskId, bo.getTaskId()); + lqw.eq(bo.getWorkId() != null, MerTaskEnroll::getWorkId, bo.getWorkId()); + lqw.eq(StringUtils.isNotBlank(bo.getWorkOpenid()), MerTaskEnroll::getWorkOpenid, bo.getWorkOpenid()); + lqw.eq(bo.getVerifyStatus() != null, MerTaskEnroll::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), MerTaskEnroll::getVerifyBy, bo.getVerifyBy()); + lqw.eq(bo.getVerifyTime() != null, MerTaskEnroll::getVerifyTime, bo.getVerifyTime()); + lqw.eq(bo.getTaskStatus() != null, MerTaskEnroll::getTaskStatus, bo.getTaskStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskRemark()), MerTaskEnroll::getTaskRemark, bo.getTaskRemark()); + lqw.eq(bo.getSettlementStatus() != null, MerTaskEnroll::getSettlementStatus, bo.getSettlementStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskConfirmFile()), MerTaskEnroll::getTaskConfirmFile, bo.getTaskConfirmFile()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskDesc()), MerTaskEnroll::getTaskDesc, bo.getTaskDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskPic()), MerTaskEnroll::getTaskPic, bo.getTaskPic()); + lqw.eq(bo.getAddTime() != null, MerTaskEnroll::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增任务的报名 + */ + @Override + public Boolean insertByBo(MerTaskEnrollBo bo) { + MerTaskEnroll add = MapstructUtils.convert(bo, MerTaskEnroll.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改任务的报名 + */ + @Override + public Boolean updateByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaskEnroll entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除任务的报名 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java new file mode 100644 index 0000000..5c3374a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java @@ -0,0 +1,696 @@ +package org.dromara.payment.task.service.impl; + +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.BeanUtils; +import org.springframework.cloud.commons.util.IdUtils; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.task.service.IMerTaskService; + +import javax.annotation.Resource; +import java.security.SecureRandom; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 项目Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +public class MerTaskServiceImpl extends BaseService implements IMerTaskService { + + @Resource + private final MerTaskMapper baseMapper; + + @Resource + private final MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + private final BusOperLogMapper busOperLogMapper; + + @Resource + private final SysSydMapper sysSydMapper; + + + @Resource + private final BusMerchantMapper busMerchantMapper; + + + @Resource + private final BusMerchantConfigMapper merchantConfigMapperConfig; + + @Resource + private final IXyjService xyjService; + + /** + * 查询项目 + */ + @Override + public MerTaskDetail queryById(Long id, PageQuery pageQuery){ + MerTaskDetail detail = new MerTaskDetail(); + detail.setMerTask(baseMapper.selectMerTaskById(id)); + + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperLog::getBusId, id); + lqw.eq(BusOperLog::getBusType, 1); + lqw.orderBy(true, true, BusOperLog::getCreateTime); + detail.setLogRecords(busOperLogMapper.selectVoList( lqw)); + + detail.setEnrolls(merTaskEnrollMapper.selectPageList(pageQuery.build(),Wrappers.query(MerTaskEnroll.class).eq("mer_task_enroll.task_id", id))); + return detail; + } + + /** + * 查询项目列表 + */ + @Override + public TableDataInfo queryPageList(MerTaskBo bo, PageQuery pageQuery) { + //数据权限控制 + valQueryContion(bo); + //判断角色 + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 判断角色查询条件 拒绝全部数据输出 + */ + private void valQueryContion(MerTaskBo bo) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + }else if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId() ){ + bo.setChannelNo(LoginHelper.getNo()); +// bo.setChannelId(LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + + + } + } + + /** + * 查询审核数据 + */ + @Override + public TableDataInfo queryCheckList(MerTaskBo bo, PageQuery pageQuery) { + //判断角色 + Integer busRole = LoginHelper.getBusRole(); + + //数据权限控制 + String phone = ""; + if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + bo.setTaskStatus(1); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + }else if(busRole == BusRole.MERCHANT.getId()){ + bo.setMerId(LoginHelper.getBusId()); + }else{ + throw new IllegalArgumentException("当前账号没有权限,请联系管理员"); + } + + + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询项目列表 + */ + @Override + public List queryList(MerTaskBo bo) { + //判断角色 + valQueryContion(bo); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper2(MerTaskBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + + lqw.eq(bo.getId() != null, "mer_task.id", bo.getId()); + lqw.eq(bo.getClassify() != null, "mer_task.classify", bo.getClassify()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "mer_task.no", bo.getNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "mer_task.name", bo.getName()); + lqw.eq(bo.getCost() != null, "mer_task.cost", bo.getCost()); + lqw.eq(bo.getCostMax() != null, "mer_task.cost_max", bo.getCostMax()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), "mer_task.industry", bo.getIndustry()); + lqw.eq(bo.getLimitNum() != null, "mer_task.limit_num", bo.getLimitNum()); + lqw.eq(bo.getStatus() != null, "mer_task.Status", bo.getStatus()); + lqw.eq(bo.getPublicTime() != null, "mer_task.public_time", bo.getPublicTime()); + lqw.eq(bo.getTaskStatus() != null, "mer_task.task_status", bo.getTaskStatus()); + lqw.eq(bo.getSubmitTime() != null, "mer_task.submit_time", bo.getSubmitTime()); + lqw.eq(bo.getOpVerifyStatus() != null, "mer_task.op_verify_status", bo.getOpVerifyStatus()); + lqw.eq(bo.getOpVerifyTime() != null, "mer_task.op_verify_time", bo.getOpVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyBy()), "mer_task.op_verify_by", bo.getOpVerifyBy()); + lqw.eq(bo.getEditTime() != null, "mer_task.edit_time", bo.getEditTime()); + lqw.eq(bo.getFrozenAmount() != null, "mer_task.frozen_amount", bo.getFrozenAmount()); + lqw.eq(bo.getRelAmount() != null, "mer_task.rel_amount", bo.getRelAmount()); + lqw.eq(bo.getRelAmountTime() != null, "mer_task.rel_amount_time", bo.getRelAmountTime()); + lqw.eq(bo.getInvoiceAmount() != null, "mer_task.invoice_amount", bo.getInvoiceAmount()); + lqw.eq(bo.getIsOut() != null, "mer_task.is_out", bo.getIsOut()); + lqw.eq(bo.getSydId() != null, "mer_task.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "mer_task.syd_no", bo.getSydNo()); + lqw.eq(bo.getBusType() != null, "mer_task.bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "mer_task.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "mer_task.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "mer_task.channel_id", bo.getChannelId()); + lqw.likeRight(StringUtils.isNotBlank(bo.getChannelNo()), "mer_task.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "mer_task.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_task.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_task.mer_no", bo.getMerNo()); + lqw.eq(bo.getSydVerifyStatus() != null, "mer_task.syd_verify_status", bo.getSydVerifyStatus()); + lqw.eq(bo.getSydVerifyTime() != null, "mer_task.syd_verify_time", bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), "mer_task.syd_verify_by", bo.getSydVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), "mer_task.syd_verify_reason", bo.getSydVerifyReason()); + lqw.like(StringUtils.isNotEmpty(bo.getMerName()),"bus_merchant.name",bo.getMerName()); + lqw.between(bo.getBeginDate() != null, "mer_task.add_time", bo.getBeginDate(), bo.getEndDate()); + lqw.in(bo.getTaskStatusList() != null && bo.getTaskStatusList().size() > 0, "mer_task.task_status" ,bo.getTaskStatusList()); + return lqw; + } + + private LambdaQueryWrapper buildQueryWrapper(MerTaskBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getClassify() != null, MerTask::getClassify, bo.getClassify()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), MerTask::getNo, bo.getNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), MerTask::getName, bo.getName()); + lqw.eq(bo.getCost() != null, MerTask::getCost, bo.getCost()); + lqw.eq(bo.getCostMax() != null, MerTask::getCostMax, bo.getCostMax()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), MerTask::getIndustry, bo.getIndustry()); + lqw.eq(bo.getLimitNum() != null, MerTask::getLimitNum, bo.getLimitNum()); + lqw.eq(bo.getCostUnit() != null, MerTask::getCostUnit, bo.getCostUnit()); + lqw.eq(bo.getBeginDate() != null, MerTask::getBeginDate, bo.getBeginDate()); + lqw.eq(bo.getEndDate() != null, MerTask::getEndDate, bo.getEndDate()); + lqw.eq(bo.getStatus() != null, MerTask::getStatus, bo.getStatus()); + lqw.eq(bo.getPublicTime() != null, MerTask::getPublicTime, bo.getPublicTime()); + lqw.eq(bo.getIsOffline() != null, MerTask::getIsOffline, bo.getIsOffline()); + lqw.eq(bo.getTaskStatus() != null, MerTask::getTaskStatus, bo.getTaskStatus()); + lqw.eq(bo.getSubmitTime() != null, MerTask::getSubmitTime, bo.getSubmitTime()); + lqw.eq(bo.getOpVerifyStatus() != null, MerTask::getOpVerifyStatus, bo.getOpVerifyStatus()); + lqw.eq(bo.getOpVerifyTime() != null, MerTask::getOpVerifyTime, bo.getOpVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyBy()), MerTask::getOpVerifyBy, bo.getOpVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyReason()), MerTask::getOpVerifyReason, bo.getOpVerifyReason()); + lqw.eq(bo.getAddTime() != null, MerTask::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), MerTask::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), MerTask::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, MerTask::getEditTime, bo.getEditTime()); + lqw.eq(bo.getFrozenAmount() != null, MerTask::getFrozenAmount, bo.getFrozenAmount()); + lqw.eq(bo.getRelAmount() != null, MerTask::getRelAmount, bo.getRelAmount()); + lqw.eq(bo.getRelAmountTime() != null, MerTask::getRelAmountTime, bo.getRelAmountTime()); + lqw.eq(bo.getInvoiceAmount() != null, MerTask::getInvoiceAmount, bo.getInvoiceAmount()); + lqw.eq(bo.getIsOut() != null, MerTask::getIsOut, bo.getIsOut()); + lqw.eq(bo.getSydId() != null, MerTask::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), MerTask::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, MerTask::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), MerTask::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, MerTask::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, MerTask::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), MerTask::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), MerTask::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, MerTask::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), MerTask::getMerNo, bo.getMerNo()); + lqw.eq(bo.getSydVerifyStatus() != null, MerTask::getSydVerifyStatus, bo.getSydVerifyStatus()); + lqw.eq(bo.getSydVerifyTime() != null, MerTask::getSydVerifyTime, bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), MerTask::getSydVerifyBy, bo.getSydVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), MerTask::getSydVerifyReason, bo.getSydVerifyReason()); + lqw.in(bo.getTaskStatusList() != null && bo.getTaskStatusList().size() > 0, MerTask::getTaskStatus,bo.getTaskStatusList()); + return lqw; + } + + /** + * 新增项目 + */ + @Override + public Boolean insertByBo(MerTaskBo bo) { + MerTask add = MapstructUtils.convert(bo, MerTask.class); + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + + SysSydVo sydVo = this.sysSydMapper.selectVoById(bo.getSydId()); + if(sydVo == null){ + this.invalidationParamsException("无效服务商!"); + } + if(!(sydVo.getStatus() != null && sydVo.getStatus().intValue() == 1)){ + this.invalidationParamsException("服务商停止接单"); + } + + }else{ + throw new IllegalArgumentException("只有企业角色才能发布项目"); + } + validEntityBeforeSave(add); + add.setNo("S" + getNo()); //mer + add.setAddBy(LoginHelper.getUsername()); + add.setAddTime(new Date()); + add.setCreateTime(add.getAddTime()); + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + add.setOpId(busOperAndAgentAndMer.getOpId()); + add.setOpNo(busOperAndAgentAndMer.getOpNo()); + add.setSydId(bo.getSydId()); + add.setSydNo(bo.getSydNo()); + add.setChannelId(busOperAndAgentAndMer.getChannelId()); + add.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + add.setChannelCode(busOperAndAgentAndMer.getChannelCode()); + add.setMerNo(LoginHelper.getNo()); + add.setStatus(1); //保存的话 是不会上架 + + if(0 == add.getTaskStatus()){ + add.setOpVerifyStatus(0); + add.setSydVerifyStatus(0); + } + + + BusOperLog merLog = new BusOperLog(); + BusOperLog opLog = new BusOperLog(); + BusOperLog sydLog = new BusOperLog(); + //自动审核 + BusMerchantConfig merchantConfig = merchantConfigMapperConfig.selectByMerId(bo.getMerId()); + + // 项目状态 0 待发布 1 保存并发布 + if(1 == add.getTaskStatus()){ + add.setPublicTime(new Date()); + + add.setTaskStatus(1); + add.setOpVerifyStatus(1);//发布完 可以 运营商审核 + //判断是否自动审核 + merLog = new BusOperLog("发布上线", BusRole.MERCHANT, add.getId(), 1); + + if(1 == merchantConfig.getAutoApprove()){ + add.setSubmitTime(new Date()); + + //插入 运营商日志 服务商日志 + opLog = new BusOperLog("运营商审核成功", BusRole.OPERATOR, add.getId(), 1); + add.setTaskStatus(2); + add.setOpVerifyStatus(3); + add.setOpVerifyTime(new Date()); + add.setOpVerifyBy(busOperAndAgentAndMer.getOpId() + ""); + add.setOpVerifyReason("自动审核通过"); + + add.setStatus(1); + //抢单需要 人员抢单 + if(add.getClassify().intValue() == 2){ + sydLog = new BusOperLog("项目发布", BusRole.SERVICE, add.getId(), 1); + add.setTaskStatus(6); + add.setSydVerifyStatus(3); + add.setSydVerifyReason("自动审核通过"); + } + + //派单 服务商审核完 直接开始 + if(add.getClassify().intValue() == 1){ + sydLog = new BusOperLog("项目开始", BusRole.SERVICE, add.getId(), 1); + add.setTaskStatus(7); + add.setSydVerifyStatus(3); + add.setBeginDate(new Date()); + add.setSydVerifyReason("自动审核通过"); + } + } + } + boolean flag = false; + if(false){ + BusMerchant merchant = new BusMerchant(); + BeanUtils.copyProperties(merchant, bo); + flag = xyjService.createProjectTask(add, merchant); + }else { + flag = this.insertTask(add) > 0; + } + if (flag) { + if(1 == add.getTaskStatus()){ + merLog.setBusId(add.getId()); + busOperLogMapper.insert(merLog); + if(1 == merchantConfig.getAutoApprove()){ + opLog.setBusId(add.getId()); + busOperLogMapper.insert(opLog); + sydLog.setBusId(add.getId()); + busOperLogMapper.insert(sydLog); + } + } + } + + return flag; + } + + private int insertTask(MerTask addTask){ + try{ + return baseMapper.insert(addTask); + }catch(Exception e){ + if( e instanceof DuplicateKeyException){ + addTask.setNo("S" + getNo()); + return this.baseMapper.insert(addTask); + } + throw e; + } + } + + /** + * 发布上线 + */ + @Override + public Boolean updateByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("只有企业角色才能发布项目"); + } + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + BusOperLog merLog = new BusOperLog(); + BusOperLog opLog = new BusOperLog(); + BusOperLog sydLog = new BusOperLog(); + + if(1 == entity.getTaskStatus()){ + entity.setOpVerifyStatus(0); + entity.setSydVerifyStatus(0); + } + + // 项目状态 0 待发布 1 保存并发布 + if(1 == entity.getTaskStatus()){ + entity.setPublicTime(new Date()); + + entity.setTaskStatus(1); + //判断是否自动审核 + merLog = new BusOperLog("发布上线", BusRole.MERCHANT, entity.getId(), 1); + busOperLogMapper.insert(merLog); + + //自动审核 + BusMerchantConfig merchantConfig = merchantConfigMapperConfig.selectByMerId(bo.getMerId()); + if(1 == merchantConfig.getAutoApprove()){ + entity.setSubmitTime(new Date()); + + //插入 运营商日志 服务商日志 + opLog = new BusOperLog("运营商审核成功", BusRole.OPERATOR, entity.getId(), 1); + busOperLogMapper.insert(opLog); + + entity.setTaskStatus(2); + entity.setOpVerifyStatus(3); + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(busOperAndAgentAndMer.getOpId() + ""); + entity.setOpVerifyReason("自动审核通过"); + + entity.setStatus(1); + //抢单需要 人员抢单 + if(entity.getClassify().intValue() == 2){ + sydLog = new BusOperLog("项目发布", BusRole.SERVICE, entity.getId(), 1); + entity.setTaskStatus(6); + entity.setSydVerifyReason("自动审核通过"); + } + + //派单 服务商审核完 直接开始 + if(entity.getClassify().intValue() == 1){ + sydLog = new BusOperLog("项目开始", BusRole.SERVICE, entity.getId(), 1); + entity.setTaskStatus(7); + entity.setBeginDate(new Date()); + entity.setSydVerifyReason("自动审核通过"); + } + busOperLogMapper.insert(sydLog); + } + } + return baseMapper.updateById(entity) > 0; + } + + @Override + public Boolean updateInfoByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + return baseMapper.updateById(entity) > 0; + } + + + @Override + public Boolean checkInfoByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); +// validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.OPERATOR.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + + if(busRole == BusRole.OPERATOR.getId()) { + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(LoginHelper.getUsername() + ""); + + BusOperLog opLog = new BusOperLog("", BusRole.OPERATOR, entity.getId(), 1); + //通过 + if(3 == entity.getOpVerifyStatus()){ + entity.setTaskStatus(2); + opLog.setLogDesc("运营商审核通过"); + entity.setSydVerifyStatus(1);// 运营商神完成 待服务商审核 + }else{ + //驳回 + entity.setTaskStatus(3); + opLog.setLogDesc("运营商审核拒绝"); + } + busOperLogMapper.insert(opLog); + } + + if(busRole == BusRole.SERVICE.getId()) { + BusOperLog sydLog = new BusOperLog("", BusRole.SERVICE, entity.getId(), 1); + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(LoginHelper.getUsername() + ""); + //通过 + if(3 == entity.getSydVerifyStatus()){ + entity.setTaskStatus(4); + + if(2 == entity.getClassify()){ + sydLog.setLogDesc("项目发布"); + entity.setTaskStatus(6); + } + //派单 服务商审核完 直接开始 + if(entity.getClassify().intValue() == 1){ + sydLog.setLogDesc("项目开始"); + entity.setTaskStatus(7); + } + }else{ + //驳回 + entity.setTaskStatus(5); + sydLog.setLogDesc("服务商拒绝转包"); + } + busOperLogMapper.insert(sydLog); + } + + return baseMapper.updateById(entity) > 0; + } + + + + @Override + public Boolean rejectCommitByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); +// validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId()){ + throw new IllegalArgumentException("当前用户没有该操作权限,请联系管理员"); + } + + if(2 == entity.getOpVerifyStatus()) { + BusOperLog opLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + entity.setOpVerifyStatus(1); + opLog.setLogDesc("提交运营商审核"); + busOperLogMapper.insert(opLog); + } + if(2 == entity.getSydVerifyStatus()) { + BusOperLog opLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + entity.setSydVerifyStatus(1); + opLog.setLogDesc("提交服务商审核"); + busOperLogMapper.insert(opLog); + } + return baseMapper.updateById(entity) > 0; + } + + public Boolean updateStateByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + if (null == entity.getId()) { + throw new IllegalArgumentException("项目ID不能为空"); + } + if (null == entity.getMerId()) { + throw new IllegalArgumentException("企业ID不能为空"); + } + if (null == entity.getStatus()) { + throw new IllegalArgumentException("上架状态不能为空"); + } + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("只有企业角色才能上架下架项目"); + } + + if(!entity.getMerId().equals(LoginHelper.getBusId() )){ + throw new IllegalArgumentException("只能操作自己企业的数据"); + } + + BusOperLog merLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + if(1 == bo.getStatus()){ + merLog.setLogDesc("项目下架"); + }else if(2 == bo.getStatus()){ + merLog.setLogDesc("项目上架"); + } + busOperLogMapper.insert(merLog); + + return baseMapper.updateById(entity) > 0; + } + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTask entity){ + if(null == entity.getBusType()){ + throw new IllegalArgumentException("请选择业务类型"); + } + if(StringUtils.isEmpty(entity.getName())){ + throw new IllegalArgumentException("请填写项目名称"); + } + if(StringUtils.isEmpty(entity.getIndustry())){ + throw new IllegalArgumentException("请选择所属行业"); + } + if(StringUtils.isEmpty(entity.getIndustryName())){ + throw new IllegalArgumentException("请选择所属行业"); + } + if(null == entity.getClassify()){ + throw new IllegalArgumentException("请选择项目类型"); + } + + if(null == entity.getSydId()){ + throw new IllegalArgumentException("请选择服务商"); + } + + if(StringUtils.isEmpty(entity.getSydNo())){ + throw new IllegalArgumentException("请选择服务商"); + } + + //派单类型 1:派单、2:抢单 + if(entity.getClassify().intValue() == 1){ + if(null == entity.getCost()){ + throw new IllegalArgumentException("请填写最小项目总金额(分)"); + } + if(null == entity.getCostMax()){ + throw new IllegalArgumentException("请填写最大项目总金额(分)"); + } + + } + if(entity.getClassify().intValue() == 2){ + if(null == entity.getCost()){ + throw new IllegalArgumentException("请填写项目总金额(分)"); + } + + if(null == entity.getLimitNum()){ + throw new IllegalArgumentException("请填写用工人数"); + } + if(null == entity.getJiezhiDate()){ + throw new IllegalArgumentException("请选择报名截至日期"); + } + } + + + if(null == entity.getProContent()){ + throw new IllegalArgumentException("请填写项目内容"); + } + + } + + /** + * 批量删除项目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + private String getNo(){ + // 创建SecureRandom对象,更安全的随机数生成器 + SecureRandom secureRandom = new SecureRandom(); + + // 生成16位的随机数字,范围是0到9999999999999999L 130652799162 + long randomNumber = secureRandom.nextLong(1000000000000L); + + // 打印随机数,确保是16位,不足前面补0 + String formattedNumber = String.format("%012d", randomNumber); + System.out.println("随机12位数字: " + formattedNumber); + return formattedNumber; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java new file mode 100644 index 0000000..faaa437 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java @@ -0,0 +1,195 @@ +package org.dromara.payment.taxRecords.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 完税证明 + * 前端访问路由地址为:/taxRecords/taxRecords + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taxRecords") +public class MerTaxRecordsController extends BaseController { + + private final IMerTaxRecordsService merTaxRecordsService; + + /** + * 查询完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecords:list") + @GetMapping("/list") + public TableDataInfo list(CommonSelConditionEntity bo, PageQuery pageQuery) { + return merTaxRecordsService.queryPageList(bo, pageQuery); + } + + /** + * 导出完税证明列表 + */ + @SaCheckPermission("taxRecords:taxRecords:export") + @Log(title = "完税证明", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaxRecordsBo bo, HttpServletResponse response) { + List list = merTaxRecordsService.queryList(bo); + ExcelUtil.exportExcel(list, "完税证明", MerTaxRecordsVo.class, response); + } + + /** + * 获取完税证明详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("taxRecords:taxRecords:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merTaxRecordsService.queryById(id)); + } + + /** + * 新增完税证明 + */ +// @SaCheckPermission("taxRecords:taxRecords:add") + @Log(title = "完税证明", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaxRecordsBo bo) { + return toAjax(merTaxRecordsService.insertByBo(bo)); + } + + /** + * 修改完税证明 + */ +// @SaCheckPermission("taxRecords:taxRecords:edit") + @Log(title = "上传完税证明", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaxRecordsBo bo) { + return toAjax(merTaxRecordsService.updateByBo(bo)); + } + + /** + * 删除完税证明 + * + * @param ids 主键串 + */ + @SaCheckPermission("taxRecords:taxRecords:remove") + @Log(title = "完税证明", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaxRecordsService.deleteWithValidByIds(List.of(ids), true)); + } + + + /*** + * 下载身份证 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadSfz") + @Log(title = "下载身份证", businessType = BusinessType.OTHER) + @GetMapping("/downLoadSfz") + public R downLoadSfz(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkSfz(trId)); + } + + + /*** + * 下载合同 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadHt") + @Log(title = "下载合同", businessType = BusinessType.OTHER) + @GetMapping("/downLoadHt") + public R downLoadHt(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkHt(trId)); + } + + + /*** + * 下载支付凭证 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadPayCer") + @Log(title = "下载支付凭证", businessType = BusinessType.OTHER) + @GetMapping("/downLoadPayCer") + public R downLoadPay(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkPayCer(trId)); + } + + + @Log(title = "根据账单编号获取账单详情", businessType = BusinessType.OTHER) + @GetMapping("/getMerBillInfo") + public R getMerBillInfo(String billNo){ + return R.ok(this.merTaxRecordsService.getMerBillInfo(billNo)); + } + + + + +// @SaCheckPermission("taxRecords:taxRecords:list") + @Log(title = "根据账单编号获取账单明细", businessType = BusinessType.OTHER) +// @GetMapping("/getMbDetailList") + public TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery) { + return merTaxRecordsService.getMerBillDetailList(billNo, pageQuery); + } + + + + + @Log(title = "根据开票流水号获取开票详情", businessType = BusinessType.OTHER) + @GetMapping("/getInvInfo") + public R getInvInfo(String invNo){ + return R.ok(this.merTaxRecordsService.getInvInfo(invNo)); + } + + + +// / @SaCheckPermission("taxRecords:taxRecords:list") + @Log(title = "根据开票流水号分页获取发票明细", businessType = BusinessType.OTHER) + @GetMapping("/getMbDetailList") + public TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery) { + return merTaxRecordsService.getInvDetailList(invNo, pageQuery); + } + + + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java new file mode 100644 index 0000000..8d81009 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.taxRecords.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 完税证明 + * 前端访问路由地址为:/taxRecords/taxRecordsDetail + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taxRecordsDetail") +public class MerTaxRecordsDetailController extends BaseController { + + private final IMerTaxRecordsDetailService merTaxRecordsDetailService; + + /** + * 查询完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerTaxRecordsDetailBo bo, PageQuery pageQuery) { + return merTaxRecordsDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:export") + @Log(title = "完税证明", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaxRecordsDetailBo bo, HttpServletResponse response) { + List list = merTaxRecordsDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "报税汇总金额", MerTaxRecordsDetailVo.class, response); + } + + /** + * 获取完税证明详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merTaxRecordsDetailService.queryById(id)); + } + + /** + * 新增完税证明 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:add") + @Log(title = "完税证明", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaxRecordsDetailBo bo) { + return toAjax(merTaxRecordsDetailService.insertByBo(bo)); + } + + /** + * 修改完税证明 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:edit") + @Log(title = "完税证明", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaxRecordsDetailBo bo) { + return toAjax(merTaxRecordsDetailService.updateByBo(bo)); + } + + /** + * 删除完税证明 + * + * @param ids 主键串 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:remove") + @Log(title = "完税证明", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaxRecordsDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java new file mode 100644 index 0000000..1863082 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java @@ -0,0 +1,85 @@ +package org.dromara.payment.taxRecords.controller; + +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorController + * @description 税务监控 + * @create 2024-06-24 10:22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/swMonitor") +public class SwMonitorController extends BaseController { + + + + @Resource + public ISwMonitorService swMonitorService; + + + /** + * 查询完税务监控 + */ +// @SaCheckPermission("swMonitor:swMonitor:list") + @GetMapping("/list") + @Log(title = "查询税务监控", businessType = BusinessType.SELECT) + public TableDataInfo list(SwMonitorBo bo, PageQuery pageQuery) { + return this.swMonitorService.queryPageList(bo, pageQuery); + } + + + + + @Log(title = "查询税务附件", businessType = BusinessType.SELECT) + @GetMapping("/getUrl") + public R getFileUrl(Long tailId,String tailNo,String subNo, Integer type,Long workId,Integer busType,Long sydId,Long merId)throws Exception { + return R.ok( null,this.swMonitorService.getFileUrl(tailId,tailNo,subNo,type,workId,busType,sydId,merId)); + } + + + /** + * 导出发票 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:export") + @Log(title = "下载发票", businessType = BusinessType.EXPORT) + @PostMapping("/exportInv") + public void export(String bo, HttpServletResponse response)throws Exception { + this.swMonitorService.exportInv(bo,response); + } + + @Log(title = "根据项目自编码查询完工信息", businessType = BusinessType.SELECT) + @GetMapping("/getTaskEnroll") + public R selTaskEnroll(String proSubNo)throws Exception{ + return R.ok(this.swMonitorService.getTaskEnrollVo(proSubNo)); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java new file mode 100644 index 0000000..da03358 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java @@ -0,0 +1,117 @@ +package org.dromara.payment.taxRecords.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 完税证明对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_tax_records") +public class MerTaxRecords extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 所属月份 + */ + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + private Integer taxStatus; + + /** + * 完税证明zip文件路径 + */ + private String taxFile; + + /** + * 完税证明备注 + */ + private String taxRemark; + + + private String sfzZip; + + private String htZip; + + private String payZip; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java new file mode 100644 index 0000000..348d7b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java @@ -0,0 +1,123 @@ +package org.dromara.payment.taxRecords.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 完税证明对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_tax_records_detail") +public class MerTaxRecordsDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 完税证明记录id + */ + private Long trId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 待完税月份 + */ + private String month; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 收入金额(分) + */ + private Long amount; + + + private Integer busType; + + + private Long workerBus; + + @TableField(exist = false) + private Long billId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java new file mode 100644 index 0000000..955549c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java @@ -0,0 +1,117 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 完税证明业务对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaxRecords.class, reverseConvertGenerate = false) +public class MerTaxRecordsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "ID不能为空", groups = {AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 所属月份 + */ + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + private Integer taxStatus; + + /** + * 完税证明zip文件路径 + */ + @NotNull(message = "完税证明不能为空", groups = {AddGroup.class, EditGroup.class }) + private String taxFile; + + /** + * 完税证明备注 + */ + private String taxRemark; + + private String sfzZip; + + private String hTzip; + + private String payZip; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java new file mode 100644 index 0000000..0f875ce --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java @@ -0,0 +1,132 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 完税证明业务对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaxRecordsDetail.class, reverseConvertGenerate = false) +public class MerTaxRecordsDetailBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 完税证明记录id + */ + @NotNull(message = "完税证明记录id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long trId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 待完税月份 + */ + @NotBlank(message = "待完税月份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String month; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workerId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workerName; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 收入金额(分) + */ + @NotNull(message = "收入金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java new file mode 100644 index 0000000..d9cdc7a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import lombok.Data; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorBo + * @description + * @create 2024-06-24 10:32 + */ + + +@Data +public class SwMonitorBo extends ProInfoCommonBo { + + //项目编码 + private String proNo; + + + //子项目编码 + private String proSubNo; + + + //收款人 + private String workName; + + + //企业名称 + private String merName; + + + //业务类型 + private String busType; + + + //服务商名称 + private String sydName; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java new file mode 100644 index 0000000..05aabbf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java @@ -0,0 +1,76 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 完税证明视图对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaxRecordsDetail.class) +public class MerTaxRecordsDetailVo implements Serializable { + + + + @ExcelProperty(value = "创建时间") + private Date createTime; + + + + /** + * 待完税月份 + */ + @ExcelProperty(value = "日期") + private String month; + + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String workerName; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行卡号") + private String bankCard; + + /** + * 收入金额(分) + */ + @ExcelIgnore + private Long amount; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amount); + } + + @ExcelProperty(value = "金额(元)") + private String amountStr; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java new file mode 100644 index 0000000..1e55aaa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java @@ -0,0 +1,183 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import cn.hutool.core.util.StrUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 完税证明视图对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaxRecords.class) +public class MerTaxRecordsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 所属月份 + */ + @ExcelProperty(value = "所属月份") + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + @ExcelProperty(value = "开票流水号(多个逗号分隔)") + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + @ExcelProperty(value = "账单批次流水号(多个逗号分隔)") + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + @ExcelProperty(value = "账单批次id(多个逗号分隔)") + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + @ExcelProperty(value = "完税证明上传状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未上传,1=:已上传") + private Integer taxStatus; + + public String getTaxStatusStr() { + + if(this.taxStatus != null){ + if( this.taxStatus == 1){ + taxStatusStr = "未上传"; + }else{ + taxStatusStr = "未上传"; + } + }else{ + return "--"; + } + + return taxStatusStr; + } + + private String taxStatusStr; + + + /** + * 完税证明zip文件路径 + */ + @ExcelProperty(value = "完税证明zip文件路径") + private String taxFile; + + + public String getOssId() { + if(StringUtils.isNotEmpty(this.taxFile)){ + return StringUtils.getOssIdDomainFileName(this.taxFile); + }else{ + return ""; + } + } + + private String ossId; + + /** + * 完税证明备注 + */ + @ExcelProperty(value = "完税证明备注") + private String taxRemark; + + private Date createTime; + + + private String sydName; + + + private String merName; + + + + private String sfzZip; + + private String hTzip; + + private String payZip; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java new file mode 100644 index 0000000..21d7230 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java @@ -0,0 +1,66 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorVo + * @description + * @create 2024-06-24 10:35 + */ +@Data +public class SwMonitorVo implements Serializable { + + + //创建时间 + private Date createTime; + + + //企业名称 + private String merName; + + + //服务商名称 + private String syName; + + + //业务类型 + private Integer busType; + + + //项目编码 + private String proNo; + + //项目子编码 + private String proSubNo; + + //收款人 + private String workName; + + private Long workId; + + //项目ID + private Long proId; + + //完税证明 + private String wsFile; + + //企业ID + private Long merId; + + //服务商ID + private Long sydId; + + //账单明细ID + private Long id; + + //账单批次号 + private String billNo; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java new file mode 100644 index 0000000..34316f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java @@ -0,0 +1,76 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 完税证明Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerTaxRecordsDetailMapper extends BaseMapperPlus { + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询完税证明明细 + **/ + Page selTaxRecordDetails(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,导出完税证明明细 + **/ + List selTaxRecordDetails(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询身份证信息 + **/ + List selTaxRecordWorkInfo(Long trId); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询合同信息 + **/ + List selTaxRecordWorkHtInfo(Map map); + + + /**** + * 说明:根据记录id,查询支付凭证信息 + * @param map + * @return + */ + List selTaxRecordWorkPayCerInfo(Map map); + + + List selectCreateTxRecordDetails(Map map); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java new file mode 100644 index 0000000..deed6db --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 完税证明Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerTaxRecordsMapper extends BaseMapperPlus { + + + /*** + * 查询企业完税证明列表 + * @param page + * @param wrapper + * @return + */ + @DataPermission({ + @DataColumn(key="colomField",value="t.mer_no") + }) + Page selTaxRecordsList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + List selectCreateTxRecords(Map map); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java new file mode 100644 index 0000000..28a3026 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorMapper + * @description 税务监控 + * @create 2024-06-24 10:41 + */ +public interface SwMonitorMapper { + + + Page selSwMonitorList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据账单号查询发票样张 + * @param billNo + * @return + */ + public List selInvoceInfoByBillNo(String billNo); + + + /*** + * 查询自雇者完工情况 + * @param proSubNo + * @return + */ + public MerTaskEnrollVo selTaskEnRollBySubBo(String proSubNo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java new file mode 100644 index 0000000..827f31f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.taxRecords.service; + +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 完税证明Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerTaxRecordsDetailService { + + /** + * 查询完税证明 + */ + MerTaxRecordsDetailVo queryById(Long id); + + /** + * 查询完税证明列表 + */ + TableDataInfo queryPageList(MerTaxRecordsDetailBo bo, PageQuery pageQuery); + + /** + * 查询完税证明列表 + */ + List queryList(MerTaxRecordsDetailBo bo); + + /** + * 新增完税证明 + */ + Boolean insertByBo(MerTaxRecordsDetailBo bo); + + /** + * 修改完税证明 + */ + Boolean updateByBo(MerTaxRecordsDetailBo bo); + + /** + * 校验并批量删除完税证明信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java new file mode 100644 index 0000000..6a1dda9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java @@ -0,0 +1,108 @@ +package org.dromara.payment.taxRecords.service; + +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 完税证明Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerTaxRecordsService { + + /** + * 查询完税证明 + */ + MerTaxRecordsVo queryById(Long id); + + /** + * 查询完税证明列表 + */ + TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery); + + /** + * 查询完税证明列表 + */ + List queryList(MerTaxRecordsBo bo); + + /** + * 新增完税证明 + */ + Boolean insertByBo(MerTaxRecordsBo bo); + + /** + * 修改完税证明 + */ + Boolean updateByBo(MerTaxRecordsBo bo); + + /** + * 校验并批量删除完税证明信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /*** + * 下载用户身份证信息 + * @param trId + * @return + */ + Map downLoadUserworkSfz(Long trId) throws Exception; + + /*** + * 下载合同信息 + * @param trId + * @return + */ + Map downLoadUserworkHt(Long trId) throws Exception; + + /*** + * 下载支付凭证信息 + * @param trId + * @return + */ + Map downLoadUserworkPayCer(Long trId) throws Exception; + + + /*** + * 根据账单编码获取账单详情 + * @param billNo + * @return + */ + MerBillVo getMerBillInfo(String billNo); + + + /**** + * 根据账单编码获取账单明细 + * @param billNo + * @param pageQuery + * @return + */ + TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery); + + /*** + * 根据开票流水获取开票详情 + * @param invNo + * @param pageQuery + * @return + */ + TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery); + + + /*** + * 根据开票流水号获取开票详情 + * @param invNo + * @return + */ + String getInvInfo(String invNo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java new file mode 100644 index 0000000..cb27b2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java @@ -0,0 +1,47 @@ +package org.dromara.payment.taxRecords.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; + +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ISwMonitorService + * @description + * @create 2024-06-24 10:42 + */ +public interface ISwMonitorService { + + + + public TableDataInfo queryPageList(SwMonitorBo bo, PageQuery pageQuery) ; + + + /**** + * 查询完工信息 + * @param proSubNo ,子项目编码 + * @return + */ + public MerTaskEnrollVo getTaskEnrollVo(String proSubNo); + + String getFileUrl(Long tailId, String tailNo, String subNo, Integer type,Long workId,Integer busType,Long syId,Long merId); + + + + void exportInv(String bo, HttpServletResponse response) throws Exception; + + + /*** + * 生成月份的完税证明 + * @param createDate + */ + void createSwRecords(Date createDate); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java new file mode 100644 index 0000000..ee22a7c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java @@ -0,0 +1,164 @@ +package org.dromara.payment.taxRecords.service.impl; + +import cn.hutool.core.date.DateUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.mapper.BusDownloadsMapper; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title AsyncTaxRecordsService + * @description + * @create 2024-05-06 19:37 + */ + +@Service +public class AsyncTaxRecordsService { + + + @Resource + private MerTaxRecordsMapper merTaxRecordsMapper; + + + @Resource + private MerTaxRecordsDetailMapper merTaxRecordsDetailMapper; + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @Resource + private BusDownloadsMapper busDownloadsMapper; + + + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + /**** + * 根据用工者ID,生成用工着身份证信息 + * @param workIds + * @throws Exception + */ + @Async + public void createSfzZipByUserInfos(List workIds,Long createBy,Integer busType)throws Exception{ + + List< UserWorker> uw = this.userWorkerMapper.selectBatchIds(workIds); + List zipUserVoList = new ArrayList(); + for(UserWorker u : uw){ + RemoteUserWorkerZipVo ruz = new RemoteUserWorkerZipVo(); + ruz.setWorkId(u.getId()); + ruz.setWorkName(u.getName()); + ruz.setCardBack(u.getCardBack()); + ruz.setCardPositive(u.getCardPositive()); + zipUserVoList.add(ruz); + } + RemoteResultZip result = this.remoteUserWokerService.createWorkerSfzZip(zipUserVoList); + if(result != null ){ + + BusDownloads busDownloads = new BusDownloads(); + busDownloads.setOssId(result.getOssId()); + busDownloads.setBusType(busType); + busDownloads.setCreateBy(createBy); + busDownloads.setUrl(result.getUrl()); + busDownloads.setCreateTime(new Date()); + this.busDownloadsMapper.insert(busDownloads); + } + } + + + /*** + * 获取身份证压缩包 + * @return + */ + @Async + public void getSfzZip(Long trId)throws Exception{ + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkInfo(trId); + RemoteResultZip result = this.remoteUserWokerService.createWorkerSfzZip(userList); + + if(result != null && StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setSfzZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + + + + /*** + * 获取合同压缩包 + * @return + */ + @Async + public void getHtZip(Long trId)throws Exception{ + + MerTaxRecordsVo vo = this.merTaxRecordsMapper.selectVoById(trId); + Date startTime = DateUtil.beginOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + Date endTime = DateUtil.endOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + + Map paraMap = new HashMap(); + paraMap.put("merId",vo.getMerId()); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + paraMap.put("trId",trId); + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkHtInfo(paraMap); + RemoteResultZip result = this.remoteUserWokerService.createWorkerHtZip(userList); + + if( result!= null && StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setHtZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + + + + /*** + * 获取支付凭证 + * @return + */ + @Async + public void getPayCerZip(Long trId)throws Exception{ + + MerTaxRecordsVo vo = this.merTaxRecordsMapper.selectVoById(trId); + Date startTime = DateUtil.beginOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + Date endTime = DateUtil.endOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + + Map paraMap = new HashMap(); + paraMap.put("merId",vo.getMerId()); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + paraMap.put("trId",trId); + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkPayCerInfo(paraMap); + RemoteResultZip result = this.remoteUserWokerService.createWorkerPayCerZip(userList); + + if(result != null &&StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setPayZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java new file mode 100644 index 0000000..353d8ed --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java @@ -0,0 +1,130 @@ +package org.dromara.payment.taxRecords.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 完税证明Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerTaxRecordsDetailServiceImpl implements IMerTaxRecordsDetailService { + + private final MerTaxRecordsDetailMapper baseMapper; + + /** + * 查询完税证明 + */ + @Override + public MerTaxRecordsDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询完税证明列表 + */ + @Override + public TableDataInfo queryPageList(MerTaxRecordsDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq("t.tr_id",bo.getTrId()); + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selTaxRecordDetails(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询完税证明列表 + */ + @Override + public List queryList(MerTaxRecordsDetailBo bo) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq("t.tr_id",bo.getTrId()); + lqw.orderByDesc("t.create_time"); + return baseMapper.selTaxRecordDetails(lqw); + } + + private QueryWrapper buildQueryWrapper(MerTaxRecordsDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getTrId() != null, "tr_id", bo.getTrId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), "month", bo.getMonth()); + lqw.eq(bo.getWorkerId() != null, "worker_id", bo.getWorkerId()); + lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), "worker_name", bo.getWorkerName()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getAmount() != null, "amount", bo.getAmount()); + return lqw; + } + + /** + * 新增完税证明 + */ + @Override + public Boolean insertByBo(MerTaxRecordsDetailBo bo) { + MerTaxRecordsDetail add = MapstructUtils.convert(bo, MerTaxRecordsDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改完税证明 + */ + @Override + public Boolean updateByBo(MerTaxRecordsDetailBo bo) { + MerTaxRecordsDetail update = MapstructUtils.convert(bo, MerTaxRecordsDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaxRecordsDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除完税证明 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java new file mode 100644 index 0000000..8b0df58 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java @@ -0,0 +1,240 @@ +package org.dromara.payment.taxRecords.service.impl; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsService; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 完税证明Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerTaxRecordsServiceImpl implements IMerTaxRecordsService { + + private final MerTaxRecordsMapper baseMapper; + + + @Resource + private AsyncTaxRecordsService asyncTaxRecordsService; + @Resource + private SysSydMapper sydMapper; + @Resource + private IXyjService xyjService; + @Resource + private BusMerchantMapper merchantMapper; + + /** + * 查询完税证明 + */ + @Override + public MerTaxRecordsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询完税证明列表 + */ + @Override + public TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getBusMerName()),"t1.name",bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getSynName()),"t2.gsmc",bo.getSynName()); + lqw.eq(bo.getWsZmStatus() != null,"t.tax_status",bo.getWsZmStatus()); + if(LoginHelper.getBusRole() == BusRole.SERVICE.getId()){ + lqw.eq("t.syd_id",LoginHelper.getBusId()); + }else if(LoginHelper.getBusRole() == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(LoginHelper.getBusRole() == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selTaxRecordsList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询完税证明列表 + */ + @Override + public List queryList(MerTaxRecordsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerTaxRecordsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), "month", bo.getMonth()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceNos()), "invoice_nos", bo.getInvoiceNos()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNos()), "bill_nos", bo.getBillNos()); + lqw.eq(StringUtils.isNotBlank(bo.getBillIds()), "bill_ids", bo.getBillIds()); + lqw.eq(bo.getTaxStatus() != null, "tax_status", bo.getTaxStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaxFile()), "tax_file", bo.getTaxFile()); + lqw.eq(StringUtils.isNotBlank(bo.getTaxRemark()), "tax_remark", bo.getTaxRemark()); + return lqw; + } + + /** + * 新增完税证明 + */ + @Override + public Boolean insertByBo(MerTaxRecordsBo bo) { + MerTaxRecords add = MapstructUtils.convert(bo, MerTaxRecords.class); + validEntityBeforeSave(add); + SysSyd sysSyd = sydMapper.selectSysSydById(add.getSydId()); + BusMerchant busMerchant = merchantMapper.selectById(add.getMerId()); + boolean flag; + if(false) { + flag = xyjService.taxpayDownLoad(busMerchant,sysSyd,bo.getMonth()); + }else { + flag = baseMapper.insert(add) > 0; + } + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改完税证明 + */ + @Override + public Boolean updateByBo(MerTaxRecordsBo bo) { + MerTaxRecords update = MapstructUtils.convert(bo, MerTaxRecords.class); + update.setTaxStatus(1); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaxRecords entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除完税证明 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + + @Override + public Map downLoadUserworkSfz(Long trId)throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getSfzZip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getSfzZip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getSfzZip(trId); + } + return resultMap; + } + + @Override + public Map downLoadUserworkHt(Long trId) throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getHTzip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getHTzip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getHtZip(trId); + } + return resultMap; + } + + @Override + public Map downLoadUserworkPayCer(Long trId) throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getPayZip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getPayZip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getPayCerZip(trId); + } + return resultMap; + } + + + + + + @Override + public MerBillVo getMerBillInfo(String billNo) { + return null; + } + + @Override + public TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery) { + return null; + } + + @Override + public TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery) { + return null; + } + + @Override + public String getInvInfo(String invNo) { + return null; + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java new file mode 100644 index 0000000..0716c19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java @@ -0,0 +1,234 @@ +package org.dromara.payment.taxRecords.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.taxRecords.mapper.SwMonitorMapper; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorServiceImpl + * @description + * @create 2024-06-24 10:42 + */ + +@Service +public class SwMonitorServiceImpl extends BaseService implements ISwMonitorService { + + + @Resource + private SwMonitorMapper baseMapper; + + @Resource + private MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + private MerBillDetailMapper billDetailMapper; + + @Resource + private UserWorkerBusinessMapper userWorkerBusinessMapper; + + @Resource + private MerTaxRecordsMapper merTaxRecordsMapper; + + + @Resource + private MerTaxRecordsDetailMapper merTaxRecordsDetailMapper; + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + + @Override + public TableDataInfo queryPageList(SwMonitorBo bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getProNo()),"t4.no",bo.getProNo()); + lqw.like(StringUtils.isNotEmpty(bo.getProSubNo()),"t.cno",bo.getProSubNo()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t.worker_name",bo.getWorkName()); + lqw.like(StringUtils.isNotEmpty(bo.getMerName()),"t1.name",bo.getMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getSydName()),"t2.gsmc",bo.getSydName()); + lqw.eq("t.pay_status",1); + lqw.eq(bo.getBusType() !=null,"t.bus_type",bo.getBusType()); + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selSwMonitorList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + + @Override + public MerTaskEnrollVo getTaskEnrollVo(String proSubNo){ + return this.baseMapper.selTaskEnRollBySubBo(proSubNo); + } + + + /*** + * @param tailId 账单明细ID + * @param tailNo 账单号 + * @param subNo 子项目编码 + * @param type 类型 + * @return + */ + @Override + public String getFileUrl(Long tailId, String tailNo, String subNo, Integer type,Long workId,Integer busType,Long syId,Long merId) { + switch(type){ + case 1: + //b2c凭证 + MerBillDetailVo vo = this.billDetailMapper.selectVoById(tailId); + return vo.getPayReceipt(); + case 2: + //b2b凭证 + vo = this.billDetailMapper.selectVoById(tailId); + return vo.getPayReceiptB2b(); + case 3: +// //发票 + List list = this.baseMapper.selInvoceInfoByBillNo(tailNo); + String result = "-1"; + for(MerInvoiceDetailVo vo1 : list){ + if(StringUtils.isNotEmpty(vo1.getInvPic())){ + result = "1"; + break; + } + } + return result; + case 4: + //完税证明 + QueryWrapper qw1 = Wrappers.query(); + qw1.likeRight("bill_nos",tailNo+","); +// qw.apply("FIND_IN_SET(bill_nos,#{billNo}) > 0",tailNo); + MerTaxRecordsVo mtrv = this.merTaxRecordsMapper.selectVoOne(qw1); + if(mtrv == null){ + return null; + }else{ + return mtrv.getTaxFile(); + } + case 5: + //查看个人合同 + QueryWrapper qw = Wrappers.query(); + qw.eq("bus_type",busType); + qw.eq("work_id",workId); + qw.eq("mer_id",merId); + qw.eq("syd_id",syId); + qw.eq("sign_status",1); + UserWorkerBusinessVo uwb = this.userWorkerBusinessMapper.selectVoOne(qw); + if(uwb == null){ + return null; + }else{ + return uwb.getSignFileUrl(); + } + } + return null; + } + + @Override + public void exportInv(String bo, HttpServletResponse response) throws Exception { + + List invList = this.baseMapper.selInvoceInfoByBillNo(bo); + List zipList = new ArrayList(); + if(invList != null && !invList.isEmpty()){ + for(MerInvoiceDetailVo vo : invList){ + if(StringUtils.isNotEmpty(vo.getInvPic())){ + RemoteUserWorkerZipVo zipVo = new RemoteUserWorkerZipVo(); + zipVo.setInvNo(vo.getInvNo()); + zipVo.setInvPic(vo.getInvPic()); + zipList.add(zipVo); + } + } + } + + if(zipList.isEmpty()){ + this.invalidationParamsException("未上传发票"); + } + byte[] zipByte = this.remoteUserWokerService.downLoadInvZip(zipList); + response.reset(); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.addHeader("Content-Length", "" + zipByte.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + FileUtils.setAttachmentResponseHeader(response,"发票信息.zip"); + IoUtil.write(response.getOutputStream(), false, zipByte); + + } + + + /*** + * 生成完税证明数据 + * @param createDate + */ + @Override + @Transactional + public void createSwRecords(Date createDate) { + + + String month = DateUtil.format(createDate,"yyyy-MM"); + Date firstDay = DateUtil.beginOfMonth(createDate); + Date lastDay = DateUtil.endOfMonth(createDate); + + Map paraMap = new HashMap(); + paraMap.put("startTime",firstDay); + paraMap.put("endtime",lastDay); + + List recordsList = this.merTaxRecordsMapper.selectCreateTxRecords(paraMap); + List detailList = this.merTaxRecordsDetailMapper.selectCreateTxRecordDetails(paraMap); + + for(MerTaxRecords records : recordsList){ + Long id = IdUtil.getSnowflakeNextId(); + records.setId(id); + records.setMonth(month); + records.setCreateTime(new Date()); + + for(MerTaxRecordsDetail detail: detailList){ + detail.setMonth(month); + if(records.getBillIds().contains(detail.getBillId()+"")){ + detail.setTrId(records.getId()); + } + } + } + + this.merTaxRecordsMapper.insertBatch(recordsList); + this.merTaxRecordsDetailMapper.insertBatch(detailList); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java new file mode 100644 index 0000000..41e1df4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java @@ -0,0 +1,16 @@ +package org.dromara.payment.thirdPlatform.base; + +/** + * @author sunzexing + * @version 1.0 + * @title IBaseBusinessFlowService + * @description + * @create 2025-03-26 9:17 + */ +public interface IBaseBusinessFlowService { + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java new file mode 100644 index 0000000..df96345 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java @@ -0,0 +1,29 @@ +package org.dromara.payment.thirdPlatform.base.controller; + + +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.mapper.SysThirdPlatformMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/sysThirdPlatform") +public class SysThirdPlatformController { + @Resource + private SysThirdPlatformMapper sysThirdPlatformMapper; + + @GetMapping("/list") + public List list(){ + List sysThirdPlatforms = this.sysThirdPlatformMapper.selectList(); + List platformNames = sysThirdPlatforms.stream() + .map(SysThirdPlatform::getPlatformName) + .collect(Collectors.toList()); + return platformNames; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java new file mode 100644 index 0000000..2fc79ed --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java @@ -0,0 +1,62 @@ +package org.dromara.payment.thirdPlatform.base.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 第三方平台对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_third_platform") +public class SysThirdPlatform extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 第三方平台名称 + */ + private String platformName; + + /** + * APPID + */ + private String appId; + + /** + * json格式 + */ + private String otherParams; + + /** + * 联系人姓名 + */ + private String contactName; + + /** + * 联系人电话 + */ + private String contactTel; + + /** + * BeanName + */ + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java new file mode 100644 index 0000000..9357580 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java @@ -0,0 +1,67 @@ +package org.dromara.payment.thirdPlatform.base.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; + +/** + * 第三方平台业务对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysThirdPlatform.class, reverseConvertGenerate = false) +public class SysThirdPlatformBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 第三方平台名称 + */ + @NotBlank(message = "第三方平台名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String platformName; + + /** + * APPID + */ + @NotBlank(message = "APPID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String appId; + + /** + * json格式 + */ + @NotBlank(message = "json格式不能为空", groups = { AddGroup.class, EditGroup.class }) + private String otherParams; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactName; + + /** + * 联系人电话 + */ + @NotBlank(message = "联系人电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactTel; + + /** + * BeanName + */ + @NotBlank(message = "BeanName不能为空", groups = { AddGroup.class, EditGroup.class }) + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java new file mode 100644 index 0000000..7784049 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java @@ -0,0 +1,70 @@ +package org.dromara.payment.thirdPlatform.base.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 第三方平台视图对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysThirdPlatform.class) +public class SysThirdPlatformVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 第三方平台名称 + */ + @ExcelProperty(value = "第三方平台名称") + private String platformName; + + /** + * APPID + */ + @ExcelProperty(value = "APPID") + private String appId; + + /** + * json格式 + */ + @ExcelProperty(value = "json格式") + private String otherParams; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String contactName; + + /** + * 联系人电话 + */ + @ExcelProperty(value = "联系人电话") + private String contactTel; + + /** + * BeanName + */ + @ExcelProperty(value = "BeanName") + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java new file mode 100644 index 0000000..1436eea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java @@ -0,0 +1,20 @@ +package org.dromara.payment.thirdPlatform.base.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.domain.vo.SysThirdPlatformVo; + +/** + * 第三方平台Mapper接口 + * + * @author LionLi + * @date 2025-03-28 + */ +public interface SysThirdPlatformMapper extends BaseMapperPlus { + + + public SysThirdPlatform selectThirdAppInfo(Long sydId); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java new file mode 100644 index 0000000..65b9ba2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java @@ -0,0 +1,130 @@ +package org.dromara.payment.thirdPlatform.utils; + +public class PaymentAccountBeanBase extends PaymentConfigBase +{ + private String configName; + private String accountName; + private String accountId; + private Long paymentConfigId; + + public String getConfigName() { + return this.configName; + } + + public String getAccountName() { + return this.accountName; + } + + public String getAccountId() { + return this.accountId; + } + + public Long getPaymentConfigId() { + return this.paymentConfigId; + } + + public void setConfigName(final String configName) { + this.configName = configName; + } + + public void setAccountName(final String accountName) { + this.accountName = accountName; + } + + public void setAccountId(final String accountId) { + this.accountId = accountId; + } + + public void setPaymentConfigId(final Long paymentConfigId) { + this.paymentConfigId = paymentConfigId; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof PaymentAccountBeanBase)) { + return false; + } + final PaymentAccountBeanBase other = (PaymentAccountBeanBase)o; + if (!other.canEqual(this)) { + return false; + } + final Object this$paymentConfigId = this.getPaymentConfigId(); + final Object other$paymentConfigId = other.getPaymentConfigId(); + Label_0065: { + if (this$paymentConfigId == null) { + if (other$paymentConfigId == null) { + break Label_0065; + } + } + else if (this$paymentConfigId.equals(other$paymentConfigId)) { + break Label_0065; + } + return false; + } + final Object this$configName = this.getConfigName(); + final Object other$configName = other.getConfigName(); + Label_0102: { + if (this$configName == null) { + if (other$configName == null) { + break Label_0102; + } + } + else if (this$configName.equals(other$configName)) { + break Label_0102; + } + return false; + } + final Object this$accountName = this.getAccountName(); + final Object other$accountName = other.getAccountName(); + Label_0139: { + if (this$accountName == null) { + if (other$accountName == null) { + break Label_0139; + } + } + else if (this$accountName.equals(other$accountName)) { + break Label_0139; + } + return false; + } + final Object this$accountId = this.getAccountId(); + final Object other$accountId = other.getAccountId(); + if (this$accountId == null) { + if (other$accountId == null) { + return true; + } + } + else if (this$accountId.equals(other$accountId)) { + return true; + } + return false; + } + + @Override + protected boolean canEqual(final Object other) { + return other instanceof PaymentAccountBeanBase; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $paymentConfigId = this.getPaymentConfigId(); + result = result * 59 + (($paymentConfigId == null) ? 43 : $paymentConfigId.hashCode()); + final Object $configName = this.getConfigName(); + result = result * 59 + (($configName == null) ? 43 : $configName.hashCode()); + final Object $accountName = this.getAccountName(); + result = result * 59 + (($accountName == null) ? 43 : $accountName.hashCode()); + final Object $accountId = this.getAccountId(); + result = result * 59 + (($accountId == null) ? 43 : $accountId.hashCode()); + return result; + } + + @Override + public String toString() { + return "PaymentAccountBeanBase(configName=" + this.getConfigName() + ", accountName=" + this.getAccountName() + ", accountId=" + this.getAccountId() + ", paymentConfigId=" + this.getPaymentConfigId() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java new file mode 100644 index 0000000..45a9d19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java @@ -0,0 +1,83 @@ +package org.dromara.payment.thirdPlatform.utils; + +public class PaymentConfigBase +{ + boolean sub; + String tax; + boolean auto; + + public boolean isSub() { + return this.sub; + } + + public String getTax() { + return this.tax; + } + + public boolean isAuto() { + return this.auto; + } + + public void setSub(final boolean sub) { + this.sub = sub; + } + + public void setTax(final String tax) { + this.tax = tax; + } + + public void setAuto(final boolean auto) { + this.auto = auto; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof PaymentConfigBase)) { + return false; + } + final PaymentConfigBase other = (PaymentConfigBase)o; + if (!other.canEqual(this)) { + return false; + } + if (this.isSub() != other.isSub()) { + return false; + } + if (this.isAuto() != other.isAuto()) { + return false; + } + final Object this$tax = this.getTax(); + final Object other$tax = other.getTax(); + if (this$tax == null) { + if (other$tax == null) { + return true; + } + } + else if (this$tax.equals(other$tax)) { + return true; + } + return false; + } + + protected boolean canEqual(final Object other) { + return other instanceof PaymentConfigBase; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * 59 + (this.isSub() ? 79 : 97); + result = result * 59 + (this.isAuto() ? 79 : 97); + final Object $tax = this.getTax(); + result = result * 59 + (($tax == null) ? 43 : $tax.hashCode()); + return result; + } + + @Override + public String toString() { + return "PaymentConfigBase(sub=" + this.isSub() + ", tax=" + this.getTax() + ", auto=" + this.isAuto() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java new file mode 100644 index 0000000..e783829 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java @@ -0,0 +1,47 @@ +package org.dromara.payment.thirdPlatform.utils; + + + +import cn.hutool.core.lang.Assert; +import org.dromara.payment.thirdPlatform.xinyujian.config.XinyujianAccountBean; +import org.dromara.payment.thirdPlatform.xinyujian.config.XinyujianConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +@Service +public class PaymentConfigUtils { + private static final Logger log = LoggerFactory.getLogger(PaymentConfigUtils.class); + + + + @Resource + private XinyujianConfig xinyujianConfig; + + + + public XinyujianAccountBean getXyjAccountBean(Long paymentConfigId) { + XinyujianAccountBean accountBean = (XinyujianAccountBean)this.xinyujianConfig.getAccounts().get(paymentConfigId); + Assert.isNull(accountBean, "益零工配置不存在"); + accountBean.setPaymentConfigId(paymentConfigId); + return accountBean; + } + + public List listXyjAccountBeans() { + List list = new ArrayList<>(); + Map map = this.xinyujianConfig.getAccounts(); + for (Long paymentConfigId : map.keySet()) { + XinyujianAccountBean bean = map.get(paymentConfigId); + bean.setPaymentConfigId(paymentConfigId); + list.add(bean); + } + return list; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java new file mode 100644 index 0000000..82b5639 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java @@ -0,0 +1,26 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + +import lombok.EqualsAndHashCode; +import org.dromara.payment.thirdPlatform.utils.PaymentAccountBeanBase; + +@EqualsAndHashCode +public class XinyujianAccountBean extends PaymentAccountBeanBase { + private String endpoint; + + public String toString() { + return "XinyujianAccountBean(endpoint=" + getEndpoint() + ")"; + } + + + protected boolean canEqual(Object other) { + return other instanceof XinyujianAccountBean; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + public String getEndpoint() { + return this.endpoint; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java new file mode 100644 index 0000000..c49f5f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java @@ -0,0 +1,31 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + + +import lombok.EqualsAndHashCode; +import org.dromara.payment.thirdPlatform.utils.PaymentConfigBase; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.Map; + +@EqualsAndHashCode +@Configuration +@ConfigurationProperties(prefix = "payment.xinyujian") +public class XinyujianConfig extends PaymentConfigBase { + Map accounts; + + public String toString() { + return "XinyujianConfig(accounts=" + getAccounts() + ")"; + } + protected boolean canEqual(Object other) { + return other instanceof XinyujianConfig; + } + + public void setAccounts(Map accounts) { + this.accounts = accounts; + } + + public Map getAccounts() { + return this.accounts; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java new file mode 100644 index 0000000..afc70f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java @@ -0,0 +1,27 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + +import lombok.Data; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjConfig + * @description + * @create 2025-03-28 15:29 + */ + +@Data +public class XyjConfig { + + private Long id; + + private String appid; + + private String otherPublicKey ; + + private String myPrivateKey ; + + private String baseUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java new file mode 100644 index 0000000..c0dc0b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java @@ -0,0 +1,101 @@ +package org.dromara.payment.thirdPlatform.xinyujian.controller; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjCallbackController + * @description 薪遇见回调接口 + * @create 2025-03-28 15:30 + */ +@Slf4j +@Data +@RestController +@RequestMapping("/thirdApi/v1/xyj/") +public class XyjCallbackController { + + + @Resource + private IXyjService xyjService; + + + + /** + * 处理商户回调请求 + * 该方法用于处理来自合作伙伴系统的商户回调,以实现特定的业务逻辑 + * @param bdvo 包含回调数据的基类对象,通过请求体自动解析获得 + * @param sydId 税源地ID,从请求的URL中提取,用于标识和处理特定商户的回调 + */ + @RequestMapping("addMerchantCallback/{sydId}") + public R addMerchantCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addMerchantCallback(bdvo, sydId); + return R.ok(); + } + + + + + @RequestMapping("addTaskCallback/{sydId}") + public R addTaskCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addTaskCallback(bdvo, sydId); + return R.ok(); + } + + + + + + @RequestMapping("addSignCallback/{sydId}") + public R addSignCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addSignCallback(bdvo, sydId); + return R.ok(); + } + + + + + /** + * 处理充值回调请求 + * 当用户完成充值后,第三方支付平台会调用此接口通知系统充值结果 + * 该方法负责接收充值回调信息并进行处理 + * + * @param bdvo 包含充值回调数据的请求体,包括但不限于订单号、支付状态等信息 + * @return 返回一个表示操作结果的响应对象,用于告知调用者处理结果 + */ + @RequestMapping("rechargeCallback") + public R rechargeCallback(@RequestBody BaseDataVo bdvo) { + // 调用服务层方法处理充值回调逻辑 + xyjService.rechargeCallback(bdvo); + // 返回操作成功响应 + return R.ok(); + } + + + @RequestMapping("invoiceCallback/{sydId}") + public R invoiceCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + // 调用服务层方法处理充值回调逻辑 + xyjService.invoiceCallback(bdvo,sydId); + // 返回操作成功响应 + return R.ok(); + } + + + + + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java new file mode 100644 index 0000000..049ed2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java @@ -0,0 +1,87 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 三方平台企业的项目任务类型对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("third_item_task_types") +public class ThirdItemTaskTypes extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * + */ + private String businessId; + + /** + * + */ + private Long parkId; + + /** + * + */ + private String itemType; + + /** + * + */ + private String itemTypeName; + + /** + * + */ + private String taskType; + + /** + * + */ + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + private String invoiceTwoName; + + /** + * 服务类型 + */ + private String serviceType; + + /** + * json + */ + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java new file mode 100644 index 0000000..1da52f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java @@ -0,0 +1,97 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; + +/** + * 三方平台企业的项目任务类型业务对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ThirdItemTaskTypes.class, reverseConvertGenerate = false) +public class ThirdItemTaskTypesBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String businessId; + + /** + * + */ + @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long parkId; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String itemType; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String itemTypeName; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskType; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + @NotBlank(message = "发票一级类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + @NotBlank(message = "发票二级类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceTwoName; + + /** + * 服务类型 + */ + @NotBlank(message = "服务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String serviceType; + + /** + * json + */ + @NotBlank(message = "json不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + @NotNull(message = "是否可用 1是,0否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java new file mode 100644 index 0000000..982d540 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java @@ -0,0 +1,100 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 三方平台企业的项目任务类型视图对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ThirdItemTaskTypes.class) +public class ThirdItemTaskTypesVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * + */ + @ExcelProperty(value = "") + private String businessId; + + /** + * + */ + @ExcelProperty(value = "") + private Long parkId; + + /** + * + */ + @ExcelProperty(value = "") + private String itemType; + + /** + * + */ + @ExcelProperty(value = "") + private String itemTypeName; + + /** + * + */ + @ExcelProperty(value = "") + private String taskType; + + /** + * + */ + @ExcelProperty(value = "") + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + @ExcelProperty(value = "发票一级类目名称") + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + @ExcelProperty(value = "发票二级类目名称") + private String invoiceTwoName; + + /** + * 服务类型 + */ + @ExcelProperty(value = "服务类型") + private String serviceType; + + /** + * json + */ + @ExcelProperty(value = "json") + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + @ExcelProperty(value = "是否可用 1是,0否") + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java new file mode 100644 index 0000000..4c5e273 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.thirdPlatform.xinyujian.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; + +/** + * 三方平台企业的项目任务类型Mapper接口 + * + * @author LionLi + * @date 2025-03-30 + */ +public interface ThirdItemTaskTypesMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java new file mode 100644 index 0000000..7de412f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; + +import java.util.Collection; +import java.util.List; + +/** + * 三方平台企业的项目任务类型Service接口 + * + * @author LionLi + * @date 2025-03-30 + */ +public interface IThirdItemTaskTypesService { + + /** + * 查询三方平台企业的项目任务类型 + */ + ThirdItemTaskTypesVo queryById(Long id); + + /** + * 查询三方平台企业的项目任务类型列表 + */ + TableDataInfo queryPageList(ThirdItemTaskTypesBo bo, PageQuery pageQuery); + + /** + * 查询三方平台企业的项目任务类型列表 + */ + List queryList(ThirdItemTaskTypesBo bo); + + /** + * 新增三方平台企业的项目任务类型 + */ + Boolean insertByBo(ThirdItemTaskTypesBo bo); + + /** + * 修改三方平台企业的项目任务类型 + */ + Boolean updateByBo(ThirdItemTaskTypesBo bo); + + /** + * 校验并批量删除三方平台企业的项目任务类型信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java new file mode 100644 index 0000000..d1edadc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java @@ -0,0 +1,144 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.thirdPlatform.base.IBaseBusinessFlowService; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.dromara.payment.worker.domain.UserWorker; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title IXyjService + * @description + * @create 2025-03-28 14:26 + */ +public interface IXyjService extends IBaseBusinessFlowService { + + + boolean addMerchant(BusMerchant busMerchant, Long sydId); + + boolean createProjectTask(MerTask task, BusMerchant merchant); + + boolean createTask(MerTask task, BusMerchant merchant); + + boolean recruitBatch(MerBill bill, List detailList, BusMerchant merchant, SysSyd syd, + MerTask task); + + boolean recruitOne(MerBill bill); + + boolean settleBatch(MerBill bill, List detailList, SysSyd syd, BusMerchant merchant, MerTask task, + BusMerchantAccount account); + + boolean signFind(BusMerchant merchant, SysSyd syd, UserWorker userWorker); + + boolean applyInvoice(BusMerchant busMerchant, SysSyd syd, MerInvoice invoice); + + /**** + * 企业入驻回调 + * @param bdvo + * @param sydId + * @return + */ + public boolean addMerchantCallback(BaseDataVo bdvo, Long sydId); + + + /**** + * 添加任务审核 + * @param bdvo + * @param sydId + * @return + */ + public boolean addTaskCallback(BaseDataVo bdvo, Long sydId); + + + /**** + * 添加任务审核 + * @param bdvo + * @param sydId + * @return + */ + public boolean addSignCallback(BaseDataVo bdvo, Long sydId); + + + + + + + /*** + * 根据企业id,同步企业任务类型 + * @param businessId + * @return + */ + public boolean synQueryTaskTypes(String businessId, Long sydId); + + + /**** + * 根据企业id,查询企业入驻结果 + * @param businessId + * @param sydId + * @return + */ + public boolean addMerchantResultSel(String businessId,Long sydId); + + + /******* + * 查询税源地信息 + * @param businessId + * @param sydId + * @return + */ + public boolean queryPark(String businessId,Long sydId); + + + /*** + * 查询批量认领的结果 + * @param merchant + * @param syd + * @param task + * @param bill + * @param detail + * @return + */ + public Boolean queryBatchSel(BusMerchant merchant, SysSyd syd, MerTask task, MerBill bill, List detail); + + + /********** + * 结算批量结算的结果查询 + * @param merchant + * @param syd + * @param bill + * @param detail + * @return + */ + public Boolean settleQueryBatchSel(BusMerchant merchant,SysSyd syd,MerBill bill,List detail); + + + /****** + * 充值回调 + * @param bdvo + */ + void rechargeCallback(BaseDataVo bdvo); + + + + public Boolean settleRetreat(BusMerchant merchant,Long sydId,String startTime,String endTime); + + void invoiceCallback(BaseDataVo bdvo, Long sydId); + + /**** + * 完税证明下载 + * @param merchant + * @param syd + * @param month + * @return + */ + public Boolean taxpayDownLoad(BusMerchant merchant,SysSyd syd,String month); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java new file mode 100644 index 0000000..149d919 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; +import org.dromara.payment.thirdPlatform.xinyujian.mapper.ThirdItemTaskTypesMapper; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 三方平台企业的项目任务类型Service业务层处理 + * + * @author LionLi + * @date 2025-03-30 + */ +@RequiredArgsConstructor +@Service +public class ThirdItemTaskTypesServiceImpl implements IThirdItemTaskTypesService { + + private final ThirdItemTaskTypesMapper baseMapper; + + /** + * 查询三方平台企业的项目任务类型 + */ + @Override + public ThirdItemTaskTypesVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询三方平台企业的项目任务类型列表 + */ + @Override + public TableDataInfo queryPageList(ThirdItemTaskTypesBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询三方平台企业的项目任务类型列表 + */ + @Override + public List queryList(ThirdItemTaskTypesBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(ThirdItemTaskTypesBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getBusinessId()), "business_id", bo.getBusinessId()); + lqw.eq(bo.getParkId() != null, "park_id", bo.getParkId()); + lqw.eq(StringUtils.isNotBlank(bo.getItemType()), "item_type", bo.getItemType()); + lqw.like(StringUtils.isNotBlank(bo.getItemTypeName()), "item_type_name", bo.getItemTypeName()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskType()), "task_type", bo.getTaskType()); + lqw.like(StringUtils.isNotBlank(bo.getTaskTypeName()), "task_type_name", bo.getTaskTypeName()); + lqw.like(StringUtils.isNotBlank(bo.getInvoiceOneName()), "invoice_one_name", bo.getInvoiceOneName()); + lqw.like(StringUtils.isNotBlank(bo.getInvoiceTwoName()), "invoice_two_name", bo.getInvoiceTwoName()); + lqw.eq(StringUtils.isNotBlank(bo.getServiceType()), "service_type", bo.getServiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getDeliveries()), "deliveries", bo.getDeliveries()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + return lqw; + } + + /** + * 新增三方平台企业的项目任务类型 + */ + @Override + public Boolean insertByBo(ThirdItemTaskTypesBo bo) { + ThirdItemTaskTypes add = MapstructUtils.convert(bo, ThirdItemTaskTypes.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改三方平台企业的项目任务类型 + */ + @Override + public Boolean updateByBo(ThirdItemTaskTypesBo bo) { + ThirdItemTaskTypes update = MapstructUtils.convert(bo, ThirdItemTaskTypes.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ThirdItemTaskTypes entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除三方平台企业的项目任务类型 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java new file mode 100644 index 0000000..cec7765 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java @@ -0,0 +1,1001 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import cn.hutool.core.lang.UUID; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.esotericsoftware.kryo.kryo5.minlog.Log; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.dromara.common.core.service.BaseService; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.mapper.SysThirdPlatformMapper; +import org.dromara.payment.thirdPlatform.xinyujian.config.XyjConfig; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; +import org.dromara.payment.thirdPlatform.xinyujian.mapper.ThirdItemTaskTypesMapper; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.dromara.payment.thirdPlatform.xinyujian.sign.MyRSA; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjServerImpl + * @description + * @create 2025-03-28 14:27 + */ + +@Slf4j +@Data +@Service +public class XyjServerImpl extends BaseService implements IXyjService { + + @Resource + public SysThirdPlatformMapper sysThirdPlatformMapper; + + @Resource + public ThirdItemTaskTypesMapper thirdItemTaskTypesMapper; + + @Resource + public UserWorkerBusinessMapper userWorkerBusinessMapper; + + @Resource + public MerBillDetailMapper merBillDetailMapper; + + @Resource + public MerInvoiceDetailMapper merInvoiceDetailMapper; + + @Resource + public SysSydMapper sysSydMapper; + + @Resource + public MerInvoiceMapper merInvoiceMapper; + + @Resource + public UserWorkerMapper userWorkerMapper; + + @Resource + public MerTaskMapper merTaskMapper; + + @Resource + public BusMerchantMapper busMerchantMapper; + + @Resource + public ISysSydService sysSydService; + + @Resource + public IBusMerchantAccountService busMerchantAccountService; + + @Resource + public IThirdItemTaskTypesService thirdItemTaskTypesService;; + + @Resource + public MerTaxRecordsMapper merTaxRecordsMapper; + + @Override + public boolean addMerchant(BusMerchant busMerchant,Long sydId) { + XyjConfig config = this.getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("companyName", busMerchant.getName()); + //企业社会统一信用代码 + data.put("creditCode", busMerchant.getName()); + //企业地址 + data.put("companyAddr", busMerchant.getName()); + //企业电话 + data.put("companyMobile", busMerchant.getName()); + //灵活用工场景编码 + data.put("serviceTypeId", busMerchant.getName()); + //注册资本(单位:万 + //元) + data.put("registeredAssets", busMerchant.getName()); + //注册时间 + data.put("regdate", busMerchant.getName()); + //企业开户行 + data.put("bankName", busMerchant.getName()); + //企业银行账户 + data.put("bankAcct", busMerchant.getName()); + //企业联系人 + data.put("contactName", busMerchant.getName()); + //企业联系人手机号 + data.put("contactMobile", busMerchant.getName()); + //法人姓名 + data.put("legalPersonName", busMerchant.getName()); + //法人身份证号 + data.put("idNo", busMerchant.getName()); + //营业执照照片 + data.put("businessLicense", busMerchant.getName()); + //基本存款账号信息表 + data.put("accountLicense", busMerchant.getName()); + //办公场地门头照 + //注册时间小于6个月必传 + data.put("houseNumberImg", busMerchant.getName()); + //办公场地场所照 + //注册时间小于6个月必传 + data.put("officeSpaceImg", busMerchant.getName()); + //办公场地前台照 + //注册时间小于6个月必传 + data.put("receptionImg", busMerchant.getName()); + //入驻回调通知URL + data.put("callBackUrl", busMerchant.getName()); + //来账通知回调地址 + data.put("bookedNoticeUrl", busMerchant.getName()); + //短信签约回调地址 用户 + //签约成功后通过该地址 + //回调 + data.put("SignChangeNoticeUrl", busMerchant.getName()); + String paramStr = JSON.toJSONString(data); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), paramStr); + log.info("企业注入新遇见平台,参数:{}", paramStr); + log.info("企业注入新遇见平台,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/company/register",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("企业注入新遇见平台,result:{}", JSON.toJSONString(vo)); + + JSONObject resultJson = (JSONObject)vo.getData(); + if(resultJson != null){ + String status = resultJson.getString("status"); + String businessId = resultJson.getString("businessId"); + BusMerchant busMerchant1 = new BusMerchant(); + busMerchant1.setBusinessId(businessId); + busMerchant1.setId(busMerchant.getId()); + busMerchant1.setBusinessStatus(status); + this.busMerchantMapper.updateById(busMerchant1); + if("11".equals(status)){ + this.addMerchantResultSel(businessId, sydId); + } + } + + return true; + } + + + + + + @Override + public boolean createProjectTask(MerTask task,BusMerchant merchant) { + XyjConfig config = this.getXyjAppInfo(task.getSydId()); + SysSyd sysSyd = sysSydMapper.selectSysSydById(task.getSydId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("parkId",sysSyd.getParkId()); + jsonObject.put("itemTitle",task.getName()); + jsonObject.put("itemTypeId",task.getItemTypeId()); + jsonObject.put("commissionType","04"); + jsonObject.put("commissionLow",task.getCost()); + jsonObject.put("commissionHigh",task.getCostMax()); + jsonObject.put("itemPeriod","04"); + jsonObject.put("checkRequire","02"); + List taskObjectList = new ArrayList<>(); + JSONObject taskObject = new JSONObject(); + taskObject.put("taskTitle",task.getName()); + taskObject.put("taskTypeId",task.getTaskTypeId()); + taskObject.put("commissionType","01"); + taskObject.put("commissionLow",task.getCost()); + taskObject.put("commissionHigh",task.getCostMax()); + taskObject.put("taskPeriod","04"); + taskObject.put("checkRequire","02"); + taskObject.put("deliveryType","2"); + taskObjectList.add(taskObject); + jsonObject.put("taskInfo",taskObjectList); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("企业注入新遇见平台创建项目和任务,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/item/create",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("企业注入新遇见平台创建项目和任务,result:{}", JSON.toJSONString(vo)); + + if(!this.checkSuccess(vo)){ + throw new RuntimeException("创建项目失败"); + } + JSONObject resultJson = (JSONObject)vo.getData(); + if(resultJson != null){ + String itemId = resultJson.getString("itemId"); + JSONArray taskInfo = resultJson.getJSONArray("taskInfo"); + if(taskInfo != null){ + String taskId = ((JSONObject)taskInfo.get(0)).getString("taskId"); + MerTask merTask = new MerTask(); + merTask.setId(task.getId()); + merTask.setTaskId(taskId); + merTask.setItemId(itemId); + this.merTaskMapper.updateById(merTask); + }else{ + throw new RuntimeException("创建任务失败"); + } + } + return true; + } + + @Override + public boolean createTask(MerTask task,BusMerchant merchant) { + return false; + } + + @Override + public boolean recruitBatch(MerBill bill, List detailList, BusMerchant merchant, SysSyd syd, + MerTask task) { + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("taskId",task.getTaskId()); + jsonObject.put("outBatchNo",bill.getId()); + jsonObject.put("total",detailList.size()); + List freelancers = new ArrayList<>(); + for(MerBillDetail detail : detailList){ + JSONObject detailObj = new JSONObject(); + detailObj.put("outSeqNo",detail.getId()); + detailObj.put("name",detail.getWorkerName()); + detailObj.put("idno",detail.getCardId()); + detailObj.put("mobile",detail.getWorkerPhone()); + freelancers.add(detailObj); + } + + jsonObject.put("freelancers",freelancers); + + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + Log.info("企业新遇见平台任务认领,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/recruitBatch",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + return false; + } + + @Override + public boolean recruitOne(MerBill bill) { + return false; + } + + @Override + public boolean settleBatch(MerBill bill, List detailList, SysSyd syd, BusMerchant merchant, MerTask task, + BusMerchantAccount account) { + + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("taskId",task.getTaskId()); + jsonObject.put("acctNo",account.getBankVirtualCard()); + jsonObject.put("outBatchNo",bill.getId()); + jsonObject.put("totalSettleFee",bill.getMoney()); + jsonObject.put("total",detailList.size()); + List freelancers = new ArrayList<>(); + detailList.forEach(item -> { + JSONObject detailObj = new JSONObject(); + detailObj.put("outSeqNo",item.getId()); + detailObj.put("name",item.getWorkerName()); + detailObj.put("idno",item.getCardId()); + detailObj.put("acctNo",item.getBankCard()); + detailObj.put("settleFee",item.getAmount()); + freelancers.add(detailObj); + }); + jsonObject.put("freelancers",freelancers); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + Log.info("企业新遇见平台批量结算,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/settleBatch",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("企业新遇见平台批量结算,result:{}", JSON.toJSONString(vo)); + if (!this.checkSuccess(vo)){ + throw new RuntimeException("提交薪遇见结算失败"); + } + return true; + } + + @Override + public boolean signFind(BusMerchant merchant, SysSyd syd, UserWorker userWorker) { + + XyjConfig config = this.getXyjAppInfo(syd.getId()); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("idNo", userWorker.getCardId()); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("签约查询:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/signFind ",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + if(vo.getData() != null ){ + JSONObject resultJson = (JSONObject)vo.getData(); + String sign = resultJson.getString("sign"); + String signUrl = resultJson.getString("signUrl"); + String signDownloadUrl = resultJson.getString("signDownloadUrl"); + if("1".equals(sign)){ + //已签约 + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId, userWorker.getId()) + .eq(UserWorkerBusiness::getSydId, syd.getId()) + .set(UserWorkerBusiness::getSignStatus, 1) + .set(UserWorkerBusiness::getSignFileUrl, signDownloadUrl) + ); + }else if("0".equals(sign)){ + //未签约 + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId, userWorker.getId()) + .eq(UserWorkerBusiness::getSydId, syd.getId()) + .set(UserWorkerBusiness::getSignStatus, 0) + .set(UserWorkerBusiness::getSignUrl, signUrl) + ); + } + } + return true; + } + + @Override + public boolean applyInvoice(BusMerchant busMerchant, SysSyd syd, MerInvoice invoice) { + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",busMerchant.getBusinessId()); + jsonObject.put("outOrderNo",invoice.getId()); + jsonObject.put("parkId",syd.getParkId()); + jsonObject.put("oneObjectName",invoice.getCategoryOne()); + jsonObject.put("twoObjectName",invoice.getCategoryTwo()); + jsonObject.put("invoiceTotalFee",invoice.getInvAmount()); + //增值税普通发票 1 增值税专用发票 2 增值税普通电子发票 3 增值税专用电子发票 4 + jsonObject.put("invoiceType",invoice.getType().intValue() == 1 ? 2: 1); + jsonObject.put("invoiceAddress",busMerchant.getName()); + jsonObject.put("invoicePhone",invoice.getAddPhone()); + jsonObject.put("invoiceAcctNo",invoice.getBankCard()); + jsonObject.put("invoiceBankName",invoice.getBankAddress()); + jsonObject.put("callBackUrl","");//回调地址 + + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("申请发票:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/invoice/apply",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("申请发票,result:{}", JSON.toJSONString(vo)); + if(!this.checkSuccess(vo)){ + throw new RuntimeException("开票失败"); + } + return true; + } + + + /** + * 组装发送消息体 + * 该方法用于创建一个发送消息的请求体,包括必要的头部信息和加密签名的数据 + * + * @param appId 应用ID,用于标识消息的发送方 + * @param otherPublicKey 对方的公钥,用于加密数据 + * @param myPrivateKey 我方的私钥,用于生成签名 + * @param data 需要发送的原始数据 + * @return 返回组装好的、经过加密和签名的消息体的JSON字符串 + */ + private String createSendMsg(String appId, String otherPublicKey, String myPrivateKey, String data) { + // 创建一个基础数据对象,用于承载发送消息所需的所有信息 + BaseDataVo vo = new BaseDataVo(); + // 设置应用ID + vo.setAppid(appId); + // 生成一个20位的随机字符串作为nonceStr,用于防止重放攻击 + vo.setNonceStr(RandomStringUtils.randomAlphanumeric(20)); + // 生成一个唯一的请求消息ID + vo.setReqMsgId(UUID.randomUUID().toString().replace("-", "")); + // 设置签名类型为RSA + vo.setSignType("RSA"); + // 设置当前时间戳 + vo.setTimestamp(String.valueOf(System.currentTimeMillis())); + + try { + // 使用对方的公钥加密原始数据 + String encryptData = MyRSA.encryptByPublicKey(data, otherPublicKey); + // 将加密后的数据设置到请求体中 + vo.setData(encryptData); + // 使用我方的私钥对请求体进行签名 + String signData = MyRSA.sign(JSON.toJSONString(vo), myPrivateKey); + // 将签名设置到请求体中 + vo.setSign(signData); + } catch (Exception e) { + // 如果加密或签名过程中发生异常,记录错误日志并抛出运行时异常 + log.error("薪遇见加密签名异常" + appId + "\n" + e.toString()); + throw new RuntimeException(e); + } + + // 返回组装好的请求体的JSON字符串形式 + return JSON.toJSONString(vo); + } + + + + /** + * 使用公钥解密并验证数据的完整性 + * 该方法首先将输入的数据字符串解析为BaseDataVo对象,然后验证签名并解密数据 + * + * @param publicKey 公钥,用于验证签名 + * @param privateKey 私钥,用于解密数据 + * @param data 加密的数据字符串 + * @return 解密并验证后的BaseDataVo对象 + */ + public BaseDataVo decryptAndVerify(String publicKey, String privateKey, String data) { + // 将数据字符串解析为BaseDataVo对象 + BaseDataVo vo = (BaseDataVo) JSONObject.parseObject(data, BaseDataVo.class); + // 获取签名数据,并移除以便验证签名 + String signData = vo.getSign(); + vo.setSign(null); + try { + // 验证签名是否有效 + boolean verify = MyRSA.verify(JSON.toJSONString(vo), publicKey, signData); + vo.setVerify(Boolean.valueOf(verify)); + // 如果签名有效且数据不为空,则解密数据 + if (verify && vo.getData() != null) { + String decrypt = MyRSA.decryptByPrivateKey(JSON.toJSONString(vo.getData()), privateKey); + vo.setData(decrypt); + } + } catch (Exception e) { + // 记录验证或解密过程中的错误 + log.error("薪遇见验签解密失败:" + e.getMessage()); + e.printStackTrace(); + } + // 返回处理后的BaseDataVo对象 + return vo; + } + + + /** + * 使用公钥解密并验证数据的完整性 + * 该方法首先将输入的数据字符串解析为BaseDataVo对象,然后验证签名并解密数据 + * + * @param publicKey 公钥,用于验证签名 + * @param privateKey 私钥,用于解密数据 + * @param vo 返回数据对象 + * @return 解密并验证后的BaseDataVo对象 + */ + public BaseDataVo decryptAndVerify(String publicKey, String privateKey, BaseDataVo vo) { + // 将数据字符串解析为BaseDataVo对象 + // 获取签名数据,并移除以便验证签名 + String signData = vo.getSign(); + vo.setSign(null); + try { + // 验证签名是否有效 + boolean verify = MyRSA.verify(JSON.toJSONString(vo), publicKey, signData); + vo.setVerify(Boolean.valueOf(verify)); + // 如果签名有效且数据不为空,则解密数据 + if (verify && vo.getData() != null) { + String decrypt = MyRSA.decryptByPrivateKey(JSON.toJSONString(vo.getData()), privateKey); + vo.setData(decrypt); + } + } catch (Exception e) { + // 记录验证或解密过程中的错误 + log.error("薪遇见验签解密失败:" + e.getMessage()); + e.printStackTrace(); + } + // 返回处理后的BaseDataVo对象 + return vo; + } + + + /** + * 检查操作是否成功 + * 通过检查传入的BaseDataVo对象是否为非空且其code属性是否为"200"来判断操作是否成功 + * @param vo BaseDataVo对象,包含操作结果信息 + * @return 如果操作成功,则返回true;否则返回false + */ + public Boolean checkSuccess(BaseDataVo vo) { + // 检查vo对象是否为非空且其code属性是否为"200" + if(vo != null && "200".equals(vo.getCode())) + // 如果条件满足,表示操作成功,返回true + return Boolean.valueOf(true); + // 如果条件不满足,表示操作未成功,返回false + return Boolean.valueOf(false); + } + + + /** + * 根据第三方平台ID获取XYJ应用信息 + * 此方法用于从数据库中查询特定第三方平台的应用信息,并将其解析为XyjConfig对象 + * 如果找不到对应的信息,则抛出异常 + * + * @param sydId 税地ID,用于查询特定的应用信息 + * @return XyjConfig对象,包含解析后的应用信息 + */ + private XyjConfig getXyjAppInfo(Long sydId){ + + // 查询第三方平台应用信息 + SysThirdPlatform sysThirdPlatform = this.sysThirdPlatformMapper.selectThirdAppInfo(sydId); + + // 如果未找到对应的信息,抛出异常 + if(sysThirdPlatform == null){ + this.invalidationParamsException("未找到对应的第三方平台信息"); + } + // 可以加上redis进行缓存 + // 将查询到的信息解析为XyjConfig对象 + XyjConfig xyjConfig = JSONObject.parseObject(sysThirdPlatform.getOtherParams(), XyjConfig.class); + if(xyjConfig == null){ + this.invalidationParamsException("第三方平台配置信息无效"); + } + xyjConfig.setId(sysThirdPlatform.getId()); + // 返回解析后的配置信息 + return xyjConfig; + } + + + @Override + @Transactional + public boolean addMerchantCallback(BaseDataVo bdvo, Long sydId) { + log.info("企业注入新遇见平台回调,result:{}", JSON.toJSONString(bdvo)); + XyjConfig config = getXyjAppInfo(sydId); + + this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), bdvo); + if(!bdvo.getVerify()){ + throw new RuntimeException("验签失败"); + } + JSONObject data = (JSONObject)bdvo.getData(); + if(data == null){ + throw new RuntimeException("无数据"); + } + addMerResultDealWidth(data, config); + return true; + } + + @Override + public boolean addTaskCallback(BaseDataVo bdvo, Long sydId) { + log.info("企业任务审核新遇见平台回调,result:{}", JSON.toJSONString(bdvo)); + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = (JSONObject)bdvo.getData(); + if (data != null){ + String taskId = data.getString("taskId"); + String status = data.getString("status"); + Integer syd_verify_status = null; + if("04".equals(status)){ + //审核拒绝 + syd_verify_status = 2; + }else if("03".equals(status)){ + //审核通过 + syd_verify_status = 3; + } + if(syd_verify_status != null){ + this.merTaskMapper.update(new LambdaUpdateWrapper().eq(MerTask::getId,taskId) + .set(MerTask::getSydVerifyStatus,syd_verify_status)); + } + }else{ + throw new RuntimeException("无效数据"); + } + return true; + } + + @Override + public boolean addSignCallback(BaseDataVo bdvo, Long sydId) { + log.info("签约平台回调,result:{}", JSON.toJSONString(bdvo)); + JSONObject jsonObject = (JSONObject)bdvo.getData(); + if (jsonObject != null){ + String idNo = jsonObject.getString("idNo"); + String hasSign = jsonObject.getString("hasSign");//0-未签约,1-已签约,2-已解约 + String viewContractUrl = jsonObject.getString("viewContractUrl"); + String downloadContractUrl = jsonObject.getString("downloadContractUrl"); + + UserWorkerVo userWorkerVO = this.userWorkerMapper.selectVoOne(new LambdaQueryWrapper().eq(UserWorker::getCardId,idNo)); + if(userWorkerVO != null){ + if("0".equals(hasSign)){ + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId,userWorkerVO.getId()) + .eq(UserWorkerBusiness::getSydId,sydId) + .set(UserWorkerBusiness::getSignStatus,0) + .set(UserWorkerBusiness::getSignUrl,viewContractUrl) + ); + + + }else if("1".equals(hasSign)){ + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId,userWorkerVO.getId()) + .eq(UserWorkerBusiness::getSydId,sydId) + .set(UserWorkerBusiness::getSignStatus,1) + .set(UserWorkerBusiness::getSignFileUrl,downloadContractUrl) + ); + } + } + } + return true; + } + + /**** + * 入驻结果处理 + * @param data + * @param config + */ + private void addMerResultDealWidth(JSONObject data, XyjConfig config) { + //企业ID + String businessId = data.getString("businessId"); + String companyName = data.getString("companyName"); + //审核状态 + //00-暂存,01-提交风控审核,02-风控拒绝,待 + //运营审核,03-无效(关闭), + //04-提交运营审核,05-运营审核拒绝,10-待配 + //置参数,11-准入成功 + String status = data.getString("status"); + + this.busMerchantMapper.update(new LambdaUpdateWrapper().eq(BusMerchant::getBusinessId,businessId) + .set(BusMerchant::getBusinessStatus,status)); + + if("11".equals(status)){ + //准入成功 + JSONArray acctInfo = data.getJSONArray("acctInfo"); + if(acctInfo != null){ + SysSydBo sysSydBo = new SysSydBo(); + sysSydBo.setThreeId(config.getId()); + List sydList = this.sysSydService.queryList(sysSydBo); + acctInfo.forEach(item->{ + JSONObject acct = (JSONObject)item; + String acctNo = acct.getString("acctNo");//银行卡号 + String acctName = acct.getString("acctName");//账户名 + String parkName = acct.getString("parkName");//税源地名称 + Long parkId = acct.getLong("parkId");//税源地 Id + Long limitAmount = acct.getLong("limitAmount");//单笔最大限额(整数,单位:分) + String bankName = acct.getString("bankName");//银行名称 + String zfCode = acct.getString("zfCode");//支付通道编码 + sydList.forEach(syd->{ + if(syd.getGsmc().equals(parkName)){ + if(syd.getParkId() == null){ + //绑定税源地 + SysSydBo sydBo = new SysSydBo(); + sydBo.setId(syd.getId()); + sydBo.setParkId(parkId); + this.sysSydService.updateByBo(sydBo); + //添加税源地企业银行账号 + } + this.busMerchantAccountService.createThirdXnAccount(syd.getId(),Long.valueOf(businessId),companyName,bankName,acctNo,acctName); + } + }); + }); + } + } + } + + + /*********** + * 根据企业id,同步企业任务类型 + * @param businessId + * @return + */ + @Override + public boolean synQueryTaskTypes(String businessId, Long sydId) { + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("同步企业[{}]任务类型:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/baseInfo/queryTaskTypes",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("同步企业[{}]任务类型:{}", businessId, JSON.toJSONString(bdvo)); + + return true; + } + + @Override + public boolean addMerchantResultSel(String businessId, Long sydId) { + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("查询企业[{}]入驻结果:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/company/queryCompanyInfo",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("查询企业[{}]入驻结果:{}", businessId, JSON.toJSONString(bdvo)); + this.addMerResultDealWidth((JSONObject)bdvo.getData(), config); + return true; + } + + @Override + public boolean queryPark(String businessId, Long sydId) { + + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("查询企业[{}]的税源地信息:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/baseInfo/queryParks",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("查询企业[{}]的税源地信息结果:{}", businessId, JSON.toJSONString(bdvo)); + JSONObject dataObj = (JSONObject)bdvo.getData(); + if(dataObj != null){ + String parkId = dataObj.getString("parkId");//税源地 Id + ThirdItemTaskTypesBo itemTaskTypesBo = new ThirdItemTaskTypesBo(); + itemTaskTypesBo.setParkId(Long.valueOf(parkId)); + List itemTaskList = this.thirdItemTaskTypesService.queryList(itemTaskTypesBo); + if(!itemTaskList.isEmpty()){ + return true; + } + String parkName = dataObj.getString("parkName");//税源地名称 + JSONArray itemType = dataObj.getJSONArray("itemType");//项目类型 + List itemTaskTypess = new ArrayList<>(); + if(itemType != null){ + itemType.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + ThirdItemTaskTypes tTaskTypes = new ThirdItemTaskTypes(); + tTaskTypes.setParkId(Long.valueOf(parkId)); + String itemTypeId = itemObj.getString("itemTypeId");//项目类型编号 + String itemTypeName = itemObj.getString("itemTypeName");//项目类型名称 + String invoiceOneObjectName = itemObj.getString("invoiceOneObjectName");//一级开票类目 + tTaskTypes.setItemType(itemTypeId); + tTaskTypes.setItemTypeName(itemTypeName); + tTaskTypes.setInvoiceOneName(invoiceOneObjectName); + JSONArray taskType = itemObj.getJSONArray("taskType");//任务类型 + if(taskType != null){ + taskType.forEach(task->{ + JSONObject taskObj = (JSONObject)task; + String taskTypeId = taskObj.getString("taskTypeId");//任务类型编号 + String taskTypeName = taskObj.getString("taskTypeName");//任务类型名称 + String invoiceTwoObjectName = taskObj.getString("invoiceTwoObjectName");//一级开票类目*二级开票类目 + tTaskTypes.setTaskType(taskTypeId); + tTaskTypes.setTaskTypeName(taskTypeName); + tTaskTypes.setInvoiceTwoName(invoiceTwoObjectName); + }); + } + itemTaskTypess.add(tTaskTypes); + }); + if(!itemTaskTypess.isEmpty()){ + this.thirdItemTaskTypesMapper.insertBatch(itemTaskTypess); + } + } + } + return true; + } + + @Override + public Boolean queryBatchSel(BusMerchant merchant, SysSyd syd, MerTask task, MerBill bill, List detail) { + + XyjConfig config = getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("taskType", task.getTaskId()); + jsonObject.put("outBatchNo",bill.getId()); + + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("查询任务认领参数:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/queryBatch",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + if(vo.getData() != null){ + JSONObject resultJSON = (JSONObject)vo.getData(); + JSONArray array = resultJSON.getJSONArray("rows"); + detail.forEach(item->{ + array.forEach(row->{ + JSONObject rowObj = (JSONObject)row; + String idno = rowObj.getString("idno"); + String status = rowObj.getString("status");//1-认领成功,0-认领失败 + String msg = rowObj.getString("msg");//认领失败原因 + if(item.getCardId().equals(idno)){ + if("1".equals(status)){ + this.merBillDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,item.getId()) + .set(MerBillDetail::getThridRecruit,1) + ); + }else if("0".equals(status)){ + this.merBillDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,item.getId()) + .set(MerBillDetail::getThridRecruit,0) + .set(MerBillDetail::getThridRecruitReason,msg) + ); + } + } + }); + }); + } + return true; + } + + @Override + public Boolean settleQueryBatchSel(BusMerchant merchant, SysSyd syd, MerBill bill, List detail) { + XyjConfig config = getXyjAppInfo(syd.getId()); + + JSONObject jsonObject = new JSONObject(); + + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("outBatchNo",bill.getId()); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("查询结算参数:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/settle/queryBatch",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("查询结算结果:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONObject resultJSON = (JSONObject)vo.getData(); + JSONArray freelancers = resultJSON.getJSONArray("freelancers"); + freelancers.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String outSeqNo = itemObj.getString("outSeqNo");// + String seqNo = itemObj.getString("seqNo");//seqNo + Long settleFee = itemObj.getLong("settleFee");//结算金额 + Long serviceFee = itemObj.getLong("serviceFee");//服务费 + String status = itemObj.getString("status");//支付状态 0-失败,1-成功,2-支付中 + String msg = itemObj.getString("msg");//失败原因 + String remark = itemObj.getString("remark");//备注 + String payTime = itemObj.getString("payTime");//支付时间yyyy-MM-dd HH:mm:ss + + //业务处理 + + + }); + + } + return true; + } + + @Override + public void rechargeCallback(BaseDataVo bdvo) { + Log.info("充值回调:{}", JSON.toJSONString(bdvo)); + + if(bdvo.getData() != null){ + JSONObject jsonObject = (JSONObject)bdvo.getData(); + String businessId = jsonObject.getString("businessId");//商户编号 + String acctNo = jsonObject.getString("acctNo");//商户号 + Long dealFee = jsonObject.getLong("dealFee");//充值金额 + //01 充值 //02 提现 03 结算服务费 04 结算佣金 06 异名充值 08 发放退款 14 结算银行退汇 + String dealType = jsonObject.getString("dealType");//入账类型 + String dealTime = jsonObject.getString("dealTime");//入账时间 + String counterpartyAcctNo = jsonObject.getString("counterpartyAcctNo");//对方账号 + String counterpartyAcctName = jsonObject.getString("counterpartyAcctName");//对方账户名称 + String counterpartyBankName = jsonObject.getString("counterpartyBankName");//对方银行名称 + String dealId = jsonObject.getString("dealId");//交易流水号 + Long parkId = jsonObject.getLong("parkId"); + String parkName = jsonObject.getString("parkName");//税源地名称 + String remark = jsonObject.getString("remark");//备注 + //业务处理 + } + } + + @Override + public Boolean settleRetreat(BusMerchant merchant,Long sydId,String startTime,String endTime) { + + XyjConfig config = getXyjAppInfo(sydId); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("startDate",startTime); + jsonObject.put("endDate",endTime); + + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("当零工有退款或者银行退汇等退票情况时进行查询:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/settle/queryRetreat",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("当零工有退款或者银行退汇等退票情况时进行查询 result:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONArray resultJSONArray = (JSONArray)vo.getData(); + + resultJSONArray.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + Long parkId = itemObj.getLong("parkId"); + String businessId = itemObj.getString("businessId");//企业编码 + String acctNo = itemObj.getString("acctNo");//支付账户 + String outBatchNo = itemObj.getString("outBatchNo");//原批次号 + String outSeqNo = itemObj.getString("outSeqNo");//原批次内序号 + Integer type = itemObj.getInteger("type");//类型1退款2退汇 + String idNo = itemObj.getString("idNo"); + String bankNo = itemObj.getString("bankNo"); + String msg = itemObj.getString("msg"); + String refundTime = itemObj.getString("refundTime"); + Long settleFee = itemObj.getLong("settleFee");//退回金额(单位分,负数) + Long serviceFee = itemObj.getLong("serviceFee");//服务费 + String serviceRate = itemObj.getString("serviceRate");//服务费率(小数) + + //处理业务 + + }); + + } + + + + return null; + } + + @Override + @Transactional + public void invoiceCallback(BaseDataVo bdvo, Long sydId) { + Log.info("发票回调:{}", JSON.toJSONString(bdvo)); + if(bdvo.getData() != null){ + JSONObject jsonObject = (JSONObject)bdvo.getData(); + String outOrderNo = jsonObject.getString("outOrderNo");//商户订单号 + Long invoiceTotalFee = jsonObject.getLong("invoiceTotalFee");//发票申请单号 + //状态 01-待审核,02-审核通过(待开票),03-驳回作废,04-已开票,05-作废重开 06-待开票,已申请在线开票,07-已撤回 + String status = jsonObject.getString("status");//发票状态 0-失败,1-成功,2-支付中 + String message = jsonObject.getString("message"); + if("02".equals(status)){ + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,1)); + }else if("04".equals(status)){ + + JSONArray invoices = jsonObject.getJSONArray("invoices"); + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,2)); + List invoiceDetailsList = new ArrayList<>(); + invoices.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String invoiceTotalFee1 = itemObj.getString("invoiceTotalFee"); + String invoiceUrl = itemObj.getString("invoiceUrl"); + String invoiceNum = itemObj.getString("invoiceNum"); + MerInvoiceDetail invoiceDetail = new MerInvoiceDetail(); + invoiceDetail.setInvId(Long.valueOf(outOrderNo)); + invoiceDetail.setInvAmount(new BigDecimal(invoiceTotalFee1).multiply(new BigDecimal("100")).longValue()); + invoiceDetail.setAddTime(new Date()); + invoiceDetail.setDetailNo(invoiceNum); + invoiceDetail.setInvPic(invoiceUrl); + invoiceDetailsList.add(invoiceDetail); + }); + + if(!invoiceDetailsList.isEmpty()){ + this.merInvoiceDetailMapper.insertBatch(invoiceDetailsList); + } + + }else if("03".equals(status)){ + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,4) + .set(MerInvoice::getCancelReason,message)); + } + } + } + + @Override + public Boolean taxpayDownLoad(BusMerchant merchant, SysSyd syd, String month) { + + List recordList = this.merTaxRecordsMapper.selectVoList(new LambdaQueryWrapper() + .eq(MerTaxRecords::getMerId,merchant.getId()) + .eq(MerTaxRecords::getMonth,month)); + if(recordList.isEmpty()){ + return true; + } + XyjConfig config = getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("date",month); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("下载完税证明:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/taxpay/proveInfo",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("下载完税证明 result:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONArray resultJSONArray = (JSONArray)vo.getData(); + resultJSONArray.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String parkName = itemObj.getString("parkName"); + String invoiceUrl = itemObj.getString("invoiceUrl"); + for(MerTaxRecordsVo record:recordList){ + SysSyd syd1 = this.sysSydMapper.selectById(record.getSydId()); + if(parkName.equals(syd1.getGsmc())){ + this.merTaxRecordsMapper.update(new LambdaUpdateWrapper() + .eq(MerTaxRecords::getId,record.getId()) + .set(MerTaxRecords::getTaxFile,invoiceUrl) + .set(MerTaxRecords::getTaxStatus,1)); + } + } + }); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java new file mode 100644 index 0000000..169b3c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java @@ -0,0 +1,70 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author rysc + * @title: BaseDataVo + * @description: TODO + * @date 2022-03-03 11:15 + */ +@Data +public class BaseDataVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 签名 + */ + private String sign; + /** + * 签名类型 + */ + private String signType; + /** + * 时间戳 + */ + private String timestamp; + /** + * 随机字符串 + */ + private String nonceStr; + /** + * 请求id + */ + private String reqMsgId; + /** + * 平台编码 + */ + private String appid; + /** + * 响应码 + */ + private String code; + /** + * 信息 + */ + private String message; + /** + * 业务数据 + */ + private Object data; + + private String rawData; + /** + * 验签成功/失败 + */ + private Boolean verify; + + + public static void main(String[] args) { + + + + + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java new file mode 100644 index 0000000..406c01a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java @@ -0,0 +1,170 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.Random; +import java.util.UUID; + +public class MD5Utils { + /** + * 获取MD5 随机字符串 + * @return + * @throws Exception + */ + public static String genKeyPair() throws Exception { + return UUID.randomUUID().toString().replace("-", ""); + } + + /** + * + * @param md5Secret 密钥 + * @param noticeStr 随机码 + * @param timestamp 事件搓 + * @return + * @throws Exception + */ + public static String sign(String md5Secret, String noticeStr,String timestamp) throws Exception { + String password = md5Secret+noticeStr +timestamp; + // 生成一个16位的随机数 + Random random =new Random(); + StringBuilder sBuilder =new StringBuilder(16); + sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999)); + int len = sBuilder.length(); + if (len <16) { + for (int i =0; i <16 - len; i++) { + sBuilder.append("0"); + } + } + // 生成最终的加密盐 + String Salt = sBuilder.toString(); + password =md5Hex(password + Salt); + char[] cs =new char[48]; + for (int i =0; i <48; i +=3) { + cs[i] = password.charAt(i /3 *2); + char c = Salt.charAt(i /3); + cs[i +1] = c; + cs[i +2] = password.charAt(i /3 *2 +1); + } + return String.valueOf(cs); + } + + + public static boolean verify(String md5Secret, String noticeStr,String timestamp, String sign) throws Exception { + String password = md5Secret+noticeStr +timestamp; + char[] cs1 =new char[32]; + char[] cs2 =new char[16]; + for (int i =0; i <48; i +=3) { + cs1[i /3 *2] = sign.charAt(i); + cs1[i /3 *2 +1] = sign.charAt(i +2); + cs2[i /3] = sign.charAt(i +1); + } + String Salt =new String(cs2); + return md5Hex(password + Salt).equals(String.valueOf(cs1)); + } + + /** + * 解密 + * @param encryptedData + * @param md5Secret + * @param noticeStr + * @return + * @throws Exception + */ + public static String decrypt(String encryptedData, String md5Secret, String noticeStr) throws Exception { + String encryptedDataStart = encryptedData.replaceFirst(md5Hex(md5Secret+noticeStr),""); + char[] charArray = new String(Base64.decodeBase64(encryptedDataStart), StandardCharsets.UTF_8).toCharArray(); + for (int i =0; i < charArray.length; i++) { + charArray[i] = (char) (charArray[i] ^'t'); + } + String str = String.valueOf(charArray); + return str; + } + + /** + * 加密 + * @param encryptedData + * @param md5Secret + * @param noticeStr + * @return + * @throws Exception + */ + public static String encrypt(String encryptedData, String md5Secret, String noticeStr) throws Exception { + + char[] charArray = encryptedData.toCharArray(); + for (int i =0; i < charArray.length; i++) { + charArray[i] = (char) (charArray[i] ^'t'); + } + String str = String.valueOf(charArray); + return md5Hex(md5Secret+noticeStr)+Base64.encodeBase64String(str.getBytes(StandardCharsets.UTF_8)); + } + + + @SuppressWarnings("unused") + private static String md5Hex(String str) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(str.getBytes()); + return new String(new Hex().encode(digest)); + }catch (Exception e) { + e.printStackTrace(); + System.out.println(e.toString()); + return ""; + } + } + + public static void main(String[] args) throws Exception { + + + String ddata = "{\n" + + " \"sign\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpQJpD7It6WGV2Q50GR7DZcdFBDNvWgShPVuBYvsWFyz4kkDDIdLTzjcr1o2tnHaJCxhiy1QTOGFqgsc5D9CETKkafDBG5Qwa6deTUjhvzwWjn01Lk1Y7uaK0f1FrxYXmHdajHk916XM4BfGjaefXAR6q1Rz+uQAlGM1SGrXYJBwIDAQAB\",\n" + + " \"signType\": \"RSA\",\n" + + " \"appid\": \"156412121\",\n" + + " \"timestamp\": \"1645770163620\",\n" + + " \"nonceStr\": \"MPzteIbCc0JiSRDWxsTQ\",\n" + + " \"reqMsgId\": \"394b83504cfDFDSSDSedbb6af8e9247a9d6b\",\n" + + " \"data\": {\n" + + " \"companyName\": \"北京接口科技有限公司\",\n" + + " \"creditCode\": \"91110108MA04EN0G0G\",\n" + + " \"companyAddr\": \"北京市大兴区丈八沟街道\",\n" + + " \"companyMobile\": \"173196655242\",\n" + + " \"companyEmail\": \"1564515@qq.com\",\n" + + " \"businessScope\": \"建筑业行业\",\n" + + " \"businessType\": \"土木工程建筑业\",\n" + + " \"serviceTypeId\": \"1\",\n" + + " \"registeredAssets\": \"500\",\n" + + " \"regdate\": \"2022-03-01\",\n" + + " \"bankName\": \"建设银行\",\n" + + " \"bankAcct\": \"622365451052525\",\n" + + " \"bankCode\": \"45412125620252\",\n" + + " \"contactName\": \"张三\",\n" + + " \"contactMobile\": \"17319852652\",\n" + + " \"referralCode\": \"1\",\n" + + " \"taskAuto\": \"1\",\n" + + " \"legalPersonName\": \"王五\",\n" + + " \"idNo\": \"632323190605269943\",\n" + + " \"idCardFace\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"idCardEmblem\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"businessLicense\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"accountLicense\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"houseNumberImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"officeSpaceImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"receptionImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"callBackUrl\": \"https://www.baidu.com\"\n" + + " }\n" + + "}"; + + String sa= sign("d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf","156156156"); + System.out.println("签名数据==》》" + sa); + System.out.println(verify("d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaef2af","156156156",sa)); + + String ss = encrypt(ddata,"d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf"); + System.out.println("==>> 加密后数据 "+ ss); + String ss2 = decrypt(ss,"d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf"); + System.out.println("==>> 解密后数据 "+ss2); + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java new file mode 100644 index 0000000..75b3ee1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java @@ -0,0 +1,306 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + *

RSA签名,加解密处理核心文件,注意:密钥长度4096

+ * + * @author rysc + * @version $Id: RSA.java, v 0.1 2013-11-15 下午2:33:53 lilun Exp $ + */ +@Slf4j +public class MyRSA { + + + /** + * 加密算法RSA + */ + private static final String KEY_ALGORITHM = "RSA"; + + /** + * 签名算法 + */ + private static final String SIGNATURE_ALGORITHM = "SHA256withRSA"; + + /** + * 获取公钥的key + */ + private static final String PUBLIC_KEY = "RSAPublicKey"; + + + /** + * 获取私钥的key + */ + private static final String PRIVATE_KEY = "RSAPrivateKey"; + + + /** + * RSA最大加密明文大小 + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + + + /** + * RSA最大解密密文大小 + */ + private static final int MAX_DECRYPT_BLOCK = 128; + /** + * 生成的秘钥长度 一般为1024或2048 + */ + private static final int MAX_DECRYPT_SIZE = 1024; + + + /** + * @return + * @throws Exception + */ + public static Map genKeyPair() throws Exception { + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGen.initialize(MAX_DECRYPT_SIZE); + KeyPair keyPair = keyPairGen.generateKeyPair(); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + Map keyMap = new HashMap<>(2); + keyMap.put(PUBLIC_KEY, Base64.encodeBase64String(publicKey.getEncoded())); + keyMap.put(PRIVATE_KEY, Base64.encodeBase64String(privateKey.getEncoded())); + return keyMap; + } + + + /** + * 对已加密数据进行签名 + * + * @param data 已加密的数据 + * @param privateKey 私钥 + * @return 对已加密数据生成的签名 + * @throws Exception + */ + + public static String sign(String data, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(privateK); + signature.update(dataBytes); + return Base64.encodeBase64String(signature.sign()); + } + + + /** + * 验签 + * + * @param data 签名之前的数据 + * @param publicKey 公钥 + * @param sign 签名之后的数据 + * @return 验签是否成功 + * @throws Exception + */ + public static boolean verify(String data, String publicKey, String sign) throws Exception { + + + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicK = keyFactory.generatePublic(keySpec); + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(publicK); + signature.update(dataBytes); + return signature.verify(Base64.decodeBase64(sign)); + } + + + /** + * 用私钥对数据进行解密 + * + * @param encryptedData 使用公钥加密过的数据 + * @param privateKey 私钥 + * @return 解密后的数据 + * @throws Exception + */ + public static String decryptByPrivateKey(String encryptedData, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, privateK); + + int inputLen = encryptedDataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(encryptedDataBytes, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedDataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + + return new String(decryptedData, StandardCharsets.UTF_8); + } + + /** + * 公钥解密 + * + * @param encryptedData 使用私钥加密过的数据 + * @param publicKey 公钥 + * @return 解密后的数据 + * @throws Exception + */ + public static String decryptByPublicKey(String encryptedData, String publicKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicK = keyFactory.generatePublic(x509KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicK); + int inputLen = encryptedDataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(encryptedDataBytes, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedDataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + + /** + * 公钥加密 + * + * @param data 需要加密的数据 + * @param publicKey 公钥 + * @return 使用公钥加密后的数据 + * @throws Exception + */ + public static String encryptByPublicKey(String data, String publicKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicK = keyFactory.generatePublic(x509KeySpec); + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicK); + int inputLen = dataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段加密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(dataBytes, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return Base64.encodeBase64String(encryptedData); + } + + + /** + * 私钥加密 + * + * @param data 待加密的数据 + * @param privateKey 私钥 + * @return 使用私钥加密后的数据 + * @throws Exception + */ + public static String encryptByPrivateKey(String data, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateK); + int inputLen = dataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段加密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(dataBytes, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return Base64.encodeBase64String(encryptedData); + } + + + /** + * 获取私钥 + * + * @param keyMap 生成的秘钥对 + * @return + * @throws Exception + */ + public static String getPrivateKey(Map keyMap) throws Exception { + return keyMap.get(PRIVATE_KEY); + } + + + /** + * 获取公钥 + * + * @param keyMap 生成的秘钥对 + * @return + * @throws Exception + */ + public static String getPublicKey(Map keyMap) throws Exception { + return keyMap.get(PUBLIC_KEY); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java new file mode 100644 index 0000000..7b4e06f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java @@ -0,0 +1,73 @@ +package org.dromara.payment.timer; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.List; + +/** + * 同步银行交易回置单任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class BankTransactionCallBackJob { + + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionCallBackJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步银行交易回置单"); + TranLogVo lockAccId = null; + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + row = synDao.allotSyns(synBatch,2,(byte)0,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,2,(byte)0, null); + for (TranLogVo accid : schools) { + try { + tranLogService.synTransferCallBack(accid); + } catch (Exception e) { + XxlJobHelper.log("同步银行交易回置单出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("同步银行交易回置单出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, 2); + } catch (Exception e) { + XxlJobHelper.log("同步银行交易回置单时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步银行交易回置单"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java new file mode 100644 index 0000000..9f560fd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java @@ -0,0 +1,87 @@ +package org.dromara.payment.timer; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 处理银行交易任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class BankTransactionJob { + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始处理银行交易"); + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + //分配交易的处理批次 + row = synDao.allotSyns(synBatch,-1,null,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,-1,null, null); + for (TranLogVo accid : schools) { + try { + tranLogService.transaction(accid,false); + } catch (Exception e) { + e.printStackTrace(); + XxlJobHelper.log("处理银行交易出错(" + minId + "," + limit + "," +JSONObject.toJSONString(accid) + "):"+e.getMessage()); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("处理银行交易记录出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, -1); + } catch (Exception e) { + XxlJobHelper.log("处理银行交易时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束处理银行交易"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java new file mode 100644 index 0000000..c0c5f2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java @@ -0,0 +1,78 @@ +package org.dromara.payment.timer; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.List; + +/** + * 同步银行交易结果任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +@Slf4j +public class BankTransactionSynJob { + + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionSynJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步银行交易结果"); + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + row = synDao.allotSyns(synBatch,1,null,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,1,null, null); + for (TranLogVo accid : schools) { + try { + tranLogService.transaction(accid,true); + } catch (Exception e) { + e.printStackTrace(); + log.error("处理银行交易结果出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e.getMessage()); + XxlJobHelper.log("处理银行交易结果出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("同步银行交易结果出错(" + minId + "," + limit + "):",e); + XxlJobHelper.log("同步银行交易结果出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, 1); + } catch (Exception e) { + log.error("同步银行交易结果时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + XxlJobHelper.log("同步银行交易结果时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步银行交易结果"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java new file mode 100644 index 0000000..f306847 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java @@ -0,0 +1,60 @@ +package org.dromara.payment.timer; + +import cn.hutool.core.date.DateUtil; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.payment.worker.mapper.UserWorkerBillMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title CntWorkerBillInfoJob + * @description + * @create 2024-09-03 16:54 + */ + + +@Component +public class CntWorkerBillInfoJob { + + @Resource + public UserWorkerBillMapper userWorkerBillMapper; + + + @XxlJob("CntWorkerBillInfoJob") + public void updateInfo(){ + Date currentDate = new Date(); + Date startTime = DateUtil.beginOfYear(currentDate); + Date endTime = DateUtil.endOfYear(currentDate); + + Map paraMap = new HashMap(); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + + List list = this.userWorkerBillMapper.selectCurentDayWorkerBillInfo(paraMap); + int dtmYear = DateUtil.year(currentDate); + for(UserWorkerBill bill : list){ + paraMap.clear(); + paraMap.put("workerId",bill.getWorkerId()); + paraMap.put("sydId",bill.getSydId()); + paraMap.put("busType",bill.getBusType()); + paraMap.put("merId",bill.getMerId()); + paraMap.put("dtmYear",dtmYear); + this.userWorkerBillMapper.deleteUserWorkerBillByInfo(paraMap); + bill.setDtmYear(dtmYear+""); + this.userWorkerBillMapper.insert(bill); + } + + + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java new file mode 100644 index 0000000..162bb21 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java @@ -0,0 +1,49 @@ +package org.dromara.payment.timer; + +import cn.hutool.core.date.DateUtil; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title CreateSwMonitorJob + * @description 生成完税证明记录 + * @create 2024-07-26 21:46 + */ +@Component +public class CreateSwMonitorJob { + + + @Resource + private ISwMonitorService swMonitorService; + + + @XxlJob("createSwMonitorJob") + public void create(){ + + Date currentDate = new Date(); + currentDate = DateUtil.offsetDay(currentDate,-5).toJdkDate(); + + String month = DateUtil.format(currentDate,"yyyy-MM"); + XxlJobHelper.log("开始生成"+month+"完税证明记录"); + try{ + this.swMonitorService.createSwRecords(currentDate); + XxlJobHelper.log("结束生成"+month+"完税证明记录"); + }catch (Exception e){ + e.printStackTrace(); + XxlJobHelper.log("生成"+month+"完税证明记录失败"+ e.getMessage()); + } + + + + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java new file mode 100644 index 0000000..7829e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java @@ -0,0 +1,57 @@ +package org.dromara.payment.timer; + +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 发票快递自动签收任务 + */ +@Component +public class InvoiceIogisticsReceivingJob { + + @Autowired + private IMerInvoiceService invoiceService; + + @XxlJob("InvoiceIogisticsReceivingJob") + public void process() throws Exception { + PageQuery pageQuery = new PageQuery(); + pageQuery.setOrderByColumn("iogistics_time"); + pageQuery.setIsAsc("asc"); + pageQuery.setPageSize(50); + pageQuery.build(); + XxlJobHelper.log("开始自动签收发票快递"); + try { + MerInvoiceBo where = new MerInvoiceBo(); + where.setIogisticsStatus(2); + TableDataInfo pageData = null; + do { + pageData = invoiceService.queryPageList(where,pageQuery); + if(pageData.getRows().size() > 0) { + for (MerInvoiceVo inv : pageData.getRows()) { + try { + invoiceService.receivingIogistics(inv.getId(),"系统"); + } catch (Exception e) { + XxlJobHelper.log("自动签收发票快递失败(" + inv.getId() + "):",e); + } + } + pageQuery.setPageNum(pageQuery.getPageNum()+1); + } + } while (pageData.getRows().size() == pageQuery.getPageNum()); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("自动签收发票快递出错(" + pageQuery.getPageNum() + "," + pageQuery.getPageSize() + "):",e); + } + XxlJobHelper.log("结束自动签收发票快递"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java new file mode 100644 index 0000000..6433269 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java @@ -0,0 +1,36 @@ +package org.dromara.payment.timer; + +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title MerchantProductJob + * @description 商户产品费率修改定时任务 + * @create 2024-05-06 19:10 + */ +@Component +@Slf4j +public class MerchantProductJob implements BasicProcessor { + + @Resource + private BusMerchantProductMapper busMerchantProductMapper; + + @XxlJob("merchantProductProcessJob") + public ProcessResult process(TaskContext taskContext) throws Exception { + + this.busMerchantProductMapper.updateMerProInfosService(); + log.info("商户产品费率修改定时任务执行成功"); + return new ProcessResult(true); + } +} + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java new file mode 100644 index 0000000..75b6ecb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java @@ -0,0 +1,124 @@ +package org.dromara.payment.timer; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 同步商户虚拟账户余额 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class SynMerchantAccountJob { + + @Autowired + private BusMerchantAccountSynMapper synDao; + + @Autowired + private BusMerchantAccountMapper accountDao; + + @Autowired + private BusMerchantMapper shDao; + + + @DubboReference + private RemoteAccountService accountService; + + @DubboReference + private RemoteNoticeService noticeService; + + @Autowired + private IBusMerchantFlowsService merchantFlowsService; + + @XxlJob("SynMerchantAccountJob") + public void process() throws Exception { + int minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步商户虚拟账户余额"); + Integer lockAccId = null; + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + //补全不存在同步记录的账户, 从bus_merchant_account 到 bus_merchant_account_syn + synDao.autoNotExist(); + do { + //分配账户的同步批次 + row = synDao.allotSyns(synBatch,minId,0,limit); + if(row > 0) { + //查询待同步的账户id + List schools = synDao.selectSyn(synBatch, null); + for (BusMerchantAccountSynVo accid : schools) { + lockAccId = accid.getId().intValue(); + if (synDao.lock(synBatch, accid.getId().intValue()) > 0) { + Result rtn = accountService.synAccount(accid.getId().intValue(),(short)1,accid.getSynPosition(),Arrays.asList("转账失败,退回记账服务费","转账退票,退回个人服务费","退回企业服务费","代收小额支付业务手续费")); + if (rtn.hasError()) { + XxlJobHelper.log("同步账户出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + XxlJobHelper.log("同步账户:"+rtn.getResult()); + }else if (rtn.getRtnData().getAddAmount() > 0) { + BusMerchantAccountVo acc = accountDao.selectByAccId(accid.getId().intValue()); + BusMerchant merchant = shDao.selectById(acc.getMerId()); + acc.setMerName(merchant.getName()); + //充值的金额 + Long addAmount = merchantFlowsService.saveFlows(acc, rtn.getRtnData()); + if(addAmount > 0) { + noticeService.addNotice(new RemoteSysNoticeVo("商户充值通知", String.format("%s商户往%s充值%s元",merchant.getName(),rtn.getRtnData().getBankType(),new DecimalFormat("0.##").format(addAmount/100.0)), merchant.getId().intValue(), BusRole.MERCHANT)); + noticeService.addNotice(new RemoteSysNoticeVo("商户充值通知", String.format("%s商户往%s充值%s元",merchant.getName(),rtn.getRtnData().getBankType(),new DecimalFormat("0.##").format(addAmount/100.0)), rtn.getRtnData().getUnitId().intValue(), BusRole.SERVICE)); + } + } + synDao.cancelSyn(accid.getId().intValue()); + minId = accid.getId().intValue(); + lockAccId = null; + }else { + XxlJobHelper.log("同步账户加锁失败:"+synBatch+","+ JSONObject.toJSONString(accid)); + } + } + } + } while (row == limit); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + XxlJobHelper.log("同步商户虚拟账户余额出错(" + minId + "," + limit + "," + lockAccId + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch); + } catch (Exception e) { + XxlJobHelper.log("同步商户虚拟账户余额时解锁出错(" + minId + "," + limit + "," + lockAccId + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步商户虚拟账户余额"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java new file mode 100644 index 0000000..bf6b73f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java @@ -0,0 +1,318 @@ +package org.dromara.payment.util; + +import cn.hutool.core.lang.Assert; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +/** + */ +public class DateTimeUtil { + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS_SSS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"); + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + public static final DateTimeFormatter YYYYMMDDHHMMSS = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + public static final DateTimeFormatter YYYYMMDDHH = DateTimeFormatter.ofPattern("yyyyMMddHH"); + + public static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyyMMdd"); + + public static final DateTimeFormatter YYYY_MM_DD_HH = DateTimeFormatter.ofPattern("yyyy-MM-dd HH"); + public static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final DateTimeFormatter MM_DD = DateTimeFormatter.ofPattern("MM月dd日"); + public static final DateTimeFormatter YYYY = DateTimeFormatter.ofPattern("yyyy"); + public static final DateTimeFormatter MM = DateTimeFormatter.ofPattern("MM"); + public static final DateTimeFormatter HH = DateTimeFormatter.ofPattern("HH"); + public static final DateTimeFormatter YYYY_MM = DateTimeFormatter.ofPattern("yyyy年MM月"); + + /** + * Date转换为LocalDateTime + * + * @param date 日期 + * @return LocalDateTime + */ + public static LocalDateTime toLocalDateTime(Date date) { + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + } + + /** + * LocalDateTime转换为Date + * + * @param dateTime 日期时间 + * @return Date + */ + public static Date toDate(LocalDateTime dateTime) { + return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + /** + * 获取指定格式的指定时间 + * + * @param dateTime 日期时间 + * @param pattern 指定格式 + * @return 指定格式的日期时间字符串 + */ + public static String formatTime(LocalDateTime dateTime, String pattern) { + return dateTime.format(DateTimeFormatter.ofPattern(pattern)); + } + + /** + * 获取指定格式的当前时间 + * + * @param pattern 指定格式 + * @return 指定格式的当前时间日期字符串 + */ + public static String formatNow(String pattern) { + return formatTime(LocalDateTime.now(), pattern); + } + + /** + * 判断dateTime1是否早于dateTime2 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isBefore(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isBefore(dateTime2); + } + + /** + * 判断dateTime1与dateTime2是否是同一时间 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isEqual(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isEqual(dateTime2); + } + + /** + * 判断dateTime1是否晚于dateTime2 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isAfter(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isAfter(dateTime2); + } + + /** + * 获取指定日期的毫秒 + * + * @param dateTime 日期时间 + * @return 毫秒 + */ + public static Long getMilliByTime(LocalDateTime dateTime) { + return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 获取指定日期的秒 + * + * @param dateTime 日期时间 + * @return 秒 + */ + public static Long getSecondsByTime(LocalDateTime dateTime) { + return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond(); + } + + /** + * 日期加上一个数,根据field不同加不同值 + * + * @param dateTime 日期时间 + * @param number 数值 + * @param field 单位 + * @return 已添加数值后的日期时间 + */ + public static LocalDateTime plus(LocalDateTime dateTime, long number, ChronoUnit field) { + return dateTime.plus(number, field); + } + + /** + * 日期减去一个数,根据field不同减不同值 + * + * @param dateTime 日期时间 + * @param number 数值 + * @param field 单位 + * @return 已减少数值后的日期时间 + */ + public static LocalDateTime minus(LocalDateTime dateTime, long number, ChronoUnit field) { + return dateTime.minus(number, field); + } + + /** + * 获取两个日期的差 + * + * @param startDateTime 开始时间 + * @param endDateTime 结束时间 + * @param field 单位 + * @return 两个日期之间的差值 + */ + public static long between(LocalDateTime startDateTime, LocalDateTime endDateTime, ChronoUnit field) { + Period period = Period.between(LocalDate.from(startDateTime), LocalDate.from(endDateTime)); + if (field == ChronoUnit.YEARS) return ChronoUnit.YEARS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.MONTHS) return ChronoUnit.MONTHS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.DAYS) return ChronoUnit.DAYS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.HOURS) return Duration.between(startDateTime, endDateTime).toHours(); + return field.between(startDateTime, endDateTime); + } + + /** + * 获取某天的开始时间,例如:yyyy,MM,dd 00:00 + * + * @param dateTime 某天的日期时间 + * @return 某天的开始时间 + */ + public static LocalDateTime getDayStart(LocalDateTime dateTime) { + return dateTime.withHour(1) + .withMinute(0) + .withSecond(0) + .withNano(0); + } + + /** + * 获取某天的开始时间,例如:yyyy,MM,dd 00:00 + * + * @return 某天的开始时间 + */ + public static LocalDateTime getNOwDayStart() { + return LocalDateTime.now().withHour(0) + .withMinute(0) + .withSecond(0) + .withNano(0); + } + + /** + * 获取某天的结束时间,例如:yyy,MM,dd 23:59:59 + * + * @param dateTime 某天的日期时间 + * @return 某天的结束时间 + */ + public static LocalDateTime getDayEnd(LocalDateTime dateTime) { + return dateTime.withHour(23) + .withMinute(59) + .withSecond(59); + } + + /** + * 将字符串转日期成Long类型的时间戳,格式为:yyyy-MM-dd HH:mm:ss + */ + public static Long timeToLong(String time) { + Assert.notNull(time, "time is null"); + DateTimeFormatter formatString = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime parse = LocalDateTime.parse(time, formatString); + return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 将字符串转日期成Long类型的时间戳,格式为:yyyy-MM-dd HH:mm:ss + */ + public static String zonedDateTimeToString(ZonedDateTime zonedDateTime) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return zonedDateTime.format(formatter); + } + + + /** + * 获取时间段内的时间列表 + * + * @param startTime + * @param endTime + * @param dataType + * @return + */ + public static List getDateList(String startTime, String endTime, Integer dataType, DateTimeFormatter dateTimeFormatter) { + List result = new LinkedList<>(); + while (endTime.compareTo(startTime) >= 0) { + LocalDateTime localDateStartTime = LocalDateTime.parse(startTime, YYYY_MM_DD_HH_MM_SS); + result.add(localDateStartTime.format(dateTimeFormatter)); + if (dataType == 4) { + localDateStartTime = localDateStartTime.plusHours(1); + } else if (dataType == 3) { + localDateStartTime = localDateStartTime.plusDays(1); + } else if (dataType == 2) { + localDateStartTime = localDateStartTime.plusMonths(1); + } else if (dataType == 1) { + localDateStartTime = localDateStartTime.plusYears(1); + } + startTime = localDateStartTime.format(YYYY_MM_DD_HH_MM_SS); + } + return result; + } + + public static String getPreviousMonthSameTime(String dateString) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter); + LocalDate date = dateTime.toLocalDate(); + int year = date.getYear(); + int month = date.getMonthValue() - 1; + if (month == 0) { + year--; + month = 12; // December + } + int day = date.getDayOfMonth(); + int hour = dateTime.getHour(); + int minute = dateTime.getMinute(); + int second = dateTime.getSecond(); + LocalDateTime prevMonthSameTime = LocalDateTime.of(year, month, day, hour, minute, second); + String formattedString = prevMonthSameTime.format(formatter); + return formattedString; + } + + + /** + * 获取时间段内的时间列表 + * + * @param startTime + * @param endTime + * @param dataType + * @return + */ + public static List getDateList(LocalDateTime startTime, LocalDateTime endTime, Integer dataType, DateTimeFormatter dateTimeFormatter) { + List result = new LinkedList<>(); + while (endTime.compareTo(startTime) >= 0) { + result.add(startTime.format(dateTimeFormatter)); + if (dataType == 4) { + startTime = startTime.plusHours(1); + } else if (dataType == 3) { + startTime = startTime.plusDays(1); + } else if (dataType == 2) { + startTime = startTime.plusMonths(1); + } else if (dataType == 1) { + startTime = startTime.plusYears(1); + } + } + return result; + } + + /** + * 获取季度 + * + * @param dataTime + * @return + */ + public static String getQuarter(LocalDateTime dataTime) { + int year = dataTime.getYear(); + int quarter = (dataTime.getMonthValue() - 1) / 3 + 1; + if (quarter == 1) { + return "第一季度"; + } else if (quarter == 2) { + return "第二季度"; + } else if (quarter == 3) { + return "第三季度"; + } else if (quarter == 4) { + return "第四季度"; + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java new file mode 100644 index 0000000..0276252 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java @@ -0,0 +1,69 @@ +package org.dromara.payment.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; + +public class MoneyUtils { + /** + * 金额分转换为格式化后元 + * @param money 金额(分) + * @return 0.00 + */ + public static String getMoneyFormatYuan(Long money){ + return formatYuan(getMoneyYuan(money)); + } + + /** + * 金额分转换为元 + * @param money 金额(分) + * @return 0.00 + */ + public static BigDecimal getMoneyYuan(Long money){ + if(null == money){ + return new BigDecimal(0); + } + return BigDecimal.valueOf(money).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } + + /** + * 金额分转换为万 + * @param money 金额(分) + * @return 0.00 + */ + public static BigDecimal getMoneyWan(Long money){ + if(null == money){ + return new BigDecimal(0); + } + + return BigDecimal.valueOf(money).divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP); + } + + public static BigDecimal getMoneyWan(BigDecimal money){ + if(null == money){ + return new BigDecimal(0); + } + + return money.divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP); + } + + + /** + * 金额元转换为格式化后元 + * @param money 金额(元) + * @return 0.00 + */ + public static String formatYuan(BigDecimal money){ + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + return decimalFormat.format(money); + } + + /** + * 金额元转换为分 + * @param money 金额(元) + * @return 0 + */ + public static Long getMoneyFen(BigDecimal money){ + return money.multiply(new BigDecimal(100)).longValue(); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java new file mode 100644 index 0000000..25a7a62 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java @@ -0,0 +1,35 @@ +package org.dromara.payment.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class UniqueIdGenerator { + + public static String generateUniqueId(long input) { + try { + // 将long转换为byte数组 + byte[] inputBytes = java.nio.ByteBuffer.allocate(8).putLong(input).array(); + + // 使用MD5哈希函数 + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(inputBytes); + + // 将哈希值的前5个字节转换为十六进制字符串,并截取前5位 + StringBuilder hexString = new StringBuilder(); + for (byte b : digest) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.substring(0, 5); // 取前5位 + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + long input = 1811245410163494912L; + String uniqueId = generateUniqueId(input); + System.out.println(uniqueId); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java new file mode 100644 index 0000000..93a58b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java @@ -0,0 +1,120 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者账户 + * 前端访问路由地址为:/payment/workerAccount + * + * @author LionLi + * @date 2024-04-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workerAccount") +public class UserWorkerAccountController extends BaseController { + + private final IUserWorkerAccountService userWorkerAccountService; + + /** + * 查询自雇者账户列表 + */ +// @SaCheckPermission("payment:workerAccount:list") + @GetMapping("/list") + public TableDataInfo list(UserWorkerAccountBo bo, PageQuery pageQuery) { + return userWorkerAccountService.queryPageList(bo, pageQuery); + } + + + + /** + * 查询自雇者账户列表 + */ +// @SaCheckPermission("payment:workerAccount:bankList") + @GetMapping("/bankList") + public R bankList(UserWorkerAccountBo bo) { + return R.ok(userWorkerAccountService.queryList(bo)); + } + + + + + /** + * 导出自雇者账户列表 + */ + @SaCheckPermission("payment:workerAccount:export") + @Log(title = "自雇者账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerAccountBo bo, HttpServletResponse response) { + List list = userWorkerAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者账户", UserWorkerAccountVo.class, response); + } + + /** + * 获取自雇者账户详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:workerAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerAccountService.queryById(id)); + } + + /** + * 新增自雇者账户 + */ +// @SaCheckPermission("payment:workerAccount:add") + @Log(title = "自雇者账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerAccountBo bo) { + return toAjax(userWorkerAccountService.insertByBo(bo)); + } + + /** + * 修改自雇者账户 + */ +// @SaCheckPermission("payment:workerAccount:edit") + @Log(title = "自雇者账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerAccountBo bo) { + return toAjax(userWorkerAccountService.updateByBo(bo)); + } + + /** + * 删除自雇者账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:workerAccount:remove") + @Log(title = "自雇者账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java new file mode 100644 index 0000000..e819a0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java @@ -0,0 +1,267 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.service.IUserWorkerAuthorizedService; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.service.IUserWorkerBusinessService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * 用工签约查询 + * 前端访问路由地址为:/worker/workerBusiness + * + * @author LionLi + * @date 2024-04-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workerBusiness") +public class UserWorkerBusinessController extends BaseController { + + private final IUserWorkerBusinessService userWorkerBusinessService; + + + @Resource + private IUserWorkerAuthorizedService authorizedService; + + + /** + * 查询用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:list") + @GetMapping("/operlist") + @Log(title = "运营商添加用工签约列表查询-运营商", businessType = BusinessType.SELECT) + public TableDataInfo list( PageQuery pageQuery,Long merId, + Long sydId,Integer busType) { + return userWorkerBusinessService.selUserWorkByMerServInfo(pageQuery,sydId,merId,busType); + } + + /** + * 查询用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:list") + @GetMapping("/list") + public TableDataInfo list(CommonSelConditionEntity bo, PageQuery pageQuery) { + return userWorkerBusinessService.queryPageList(bo, pageQuery); + } + + + /*** + * 授权协议分页查询 + * @param bo + * @param pageQuery + * @return + */ + @GetMapping("/authList") + public TableDataInfo list(UserWorkerAuthorizedBo bo, PageQuery pageQuery) { + return this.authorizedService.queryPageList(bo, pageQuery); + } + + + /** + * 导出用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:export") + @Log(title = "用工签约查询", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(CommonSelConditionEntity bo, HttpServletResponse response) { + List list = userWorkerBusinessService.queryList(bo); + ExcelUtil.exportExcel(list, "用工签约导出", UserWorkerBusinessVo.class, response); + } + + + @Log(title = "单个导出用工的身份证信息", businessType = BusinessType.EXPORT) + @PostMapping("/exportCardImg") + public void exportCardImg(Long workId,HttpServletResponse response)throws Exception{ + this.userWorkerBusinessService.exportCardImg(workId,response); + } + + + @Log(title = "批量导出用工的身份证信息", businessType = BusinessType.EXPORT) + @PostMapping("/exportMutiCardImg") + public R exportMutiCardImgs(String workIds)throws Exception{ + this.userWorkerBusinessService.exportMutiCardImg(workIds); + return R.ok(true); + } + + + /** + * 获取用工签约查询详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("worker:workerBusiness:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerBusinessService.queryById(id)); + } + + + + /** + * 获取用工签约查询详细信息 -授权协议 + * + * @param id 主键 + */ +// @SaCheckPermission("worker:workerBusiness:getAuth")s + @GetMapping("/getAuth") + public R getAuthInfo(@NotNull(message = "主键不能为空") + Long id) { + return R.ok(this.authorizedService.queryById(id)); + } + + /** + * 新增用工签约查询 + */ + @SaCheckPermission("worker:workerBusiness:add") + @Log(title = "用工签约查询", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBusinessBo bo) { + return toAjax(userWorkerBusinessService.insertByBo(bo)); + } + + /** + * 修改用工签约查询 + */ + @SaCheckPermission("worker:workerBusiness:edit") + @Log(title = "用工签约查询", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBusinessBo bo) { + return toAjax(userWorkerBusinessService.updateByBo(bo)); + } + + /** + * 删除用工签约查询 + * + * @param ids 主键串 + */ + @SaCheckPermission("worker:workerBusiness:remove") + @Log(title = "用工签约查询", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerBusinessService.deleteWithValidByIds(List.of(ids), true)); + } + + + + + +// @SaCheckPermission("worker:workerBusiness:import") + @Log(title = "用工签约导入", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file, + Integer busType,Long sydId ,String sydNo,String domain,Long merId,String merNo )throws Exception{ + return R.ok(this.userWorkerBusinessService.upload(file,busType,sydId,sydNo,domain,merId,merNo)); + } + + + + /** + * 导出用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness_error:export") + @Log(title = "用工签约错误信息下载", businessType = BusinessType.EXPORT) + @PostMapping("/exportError") + public void exportSignError(String uuid, HttpServletResponse response) { + List list = userWorkerBusinessService.selErrorList(uuid); + ExcelUtil.exportExcel(list, "用工签约导入错误信息", UploadExcelItem.class, response); + } + + + + /** + * 用工签约,查询会员信息 + */ +// @SaCheckPermission("worker:workerBusiness:selMember") + @Log(title = "用工签约查询会员信息", businessType = BusinessType.OTHER) + @PostMapping("/selWkInfo") + public R selWkInfo(UserWorkerBusinessBo bo) { + UserWorkerVo vo = userWorkerBusinessService.selMemberInfo(bo); + return R.ok(vo); + } + + + + /*** + * 添加用工人员-运营商 + * @param bo + * @return + */ + @Log(title = "运营商添加用工人员", businessType = BusinessType.OTHER) + @PostMapping("/addUwb") + public R addUserWorkdBz(@Validated(AddGroup.class) @RequestBody UserWokerOperBo bo)throws Exception{ + return R.ok(userWorkerBusinessService.addUserWorkdBz(bo)); + } + + + + /*** + * 用工签约- -运营商 + * @return + */ + @Log(title = "用工签约-选中提交 -运营商", businessType = BusinessType.INSERT) + @PostMapping("/addSelUwb") + public R operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds){ + return R.ok(this.userWorkerBusinessService.operAddUserWorkSel(merId,sydId,busType,workIds)); + } + + + /*** + * 用工签约- -运营商 + * @return + */ + @Log(title = "用工签约-全部提交 -运营商", businessType = BusinessType.INSERT) + @PostMapping("/addAllUwb") + public R operAddUserWorkAll(Long merId,Long sydId,Integer busType){ + return R.ok(this.userWorkerBusinessService.operAddUserWorkAll(merId,sydId,busType)); + } + + + + @Log(title = "用工信息修改-运营商", businessType = BusinessType.UPDATE) + @PostMapping("/upUw") + public R updateUserWorkInfo(UserWorkerBo uw){ + return R.ok(this.userWorkerBusinessService.updateUserWorkInfo(uw)); + } + + + + @Log(title = "用工信息修改查询-运营商", businessType = BusinessType.UPDATE) + @PostMapping("/selUpUw") + public R updateUserWorkInfo(UserWorkerBusinessBo uw){ + return R.ok(this.userWorkerBusinessService.selMemberInfoNySignId(uw)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java new file mode 100644 index 0000000..1fd1088 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.service.IUserWorkerService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者 + * 前端访问路由地址为:/userWorker/Userworker + * + * @author LionLi + * @date 2024-04-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/Userworker") +public class UserWorkerController extends BaseController { + + private final IUserWorkerService userWorkerService; + + /** + * 查询自雇者列表 + */ + @SaCheckPermission("userWorker:Userworker:list") + @GetMapping("/list") + public TableDataInfo list(UserWorkerBo bo, PageQuery pageQuery) { + return userWorkerService.queryPageList(bo, pageQuery); + } + + /** + * 导出自雇者列表 + */ + @SaCheckPermission("userWorker:Userworker:export") + @Log(title = "自雇者", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerBo bo, HttpServletResponse response) { + List list = userWorkerService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者", UserWorkerVo.class, response); + } + + /** + * 获取自雇者详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("userWorker:Userworker:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerService.queryById(id)); + } + + /** + * 新增自雇者 + */ + @SaCheckPermission("userWorker:Userworker:add") + @Log(title = "自雇者", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.insertByBo(bo)); + } + + /** + * 修改自雇者 + */ + @SaCheckPermission("userWorker:Userworker:edit") + @Log(title = "自雇者", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.updateByBo(bo)); + } + + /** + * 删除自雇者 + * + * @param ids 主键串 + */ + @SaCheckPermission("userWorker:Userworker:remove") + @Log(title = "自雇者", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java new file mode 100644 index 0000000..6097dc7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java @@ -0,0 +1,135 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java new file mode 100644 index 0000000..64527ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java @@ -0,0 +1,22 @@ +package org.dromara.payment.worker.domain; + +import lombok.Data; + +@Data +public class ThirdConf{ + + private String type; + + private String secretId; + + private String secretKey; + + private String endPoint; + + private String ruleId; + + private String redirectUrl; + + private String region; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java new file mode 100644 index 0000000..968e211 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java @@ -0,0 +1,195 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker") +public class UserWorker extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java new file mode 100644 index 0000000..420dab3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java @@ -0,0 +1,88 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者账户对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_account") +public class UserWorkerAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + private String phone; + + /** + * 结算通道 + */ + private String passage; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + private Integer status; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java new file mode 100644 index 0000000..989ea5c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java @@ -0,0 +1,73 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 授权协议对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_authorized") +public class UserWorkerAuthorized extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + private Integer signStatus; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 签约文件地址 + */ + private String signFileUrl; + + /** + * 协议签字图片 + */ + private String signPic; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java new file mode 100644 index 0000000..337b5aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java @@ -0,0 +1,58 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 会员代发金额汇总表对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_bill") +public class UserWorkerBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者ID + */ + private Long workerId; + + private Long merId; + + /** + * 服务商ID + */ + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + private Long busType; + + /** + * 年份 + */ + private String dtmYear; + + /** + * 代发总金额 + */ + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java new file mode 100644 index 0000000..5e58495 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java @@ -0,0 +1,151 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 用工签约查询对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_business") +public class UserWorkerBusiness extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + private Integer signStatus; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 签约文件地址 + */ + private String signFileUrl; + + /** + * 协议签字图片 + */ + private String signPic; + + /** + * 年代发金额所属年份 + */ + private String moneyYearDate; + + /** + * 年代发金额 + */ + private Long moneyYear; + + /** + * 手机号 + */ + private String vPhone; + + + + /** + * 签约地址 + */ + private String signUrl; + + /** + * 预览地址 + */ + private String webUrl; + + /** + * ossid + */ + private String ossid; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java new file mode 100644 index 0000000..82a81ef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.worker.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWokerOperBo + * @description + * @create 2024-04-29 11:40 + */ + +@Data +public class UserWokerOperBo implements Serializable { + + //企业ID + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class }) + private Long merId; + + //企业编号 + @NotNull(message = "企业编号不能为空", groups = { AddGroup.class }) + private String merNo; + + //服务商编号 + @NotNull(message = "服务商编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + //服务商ID + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class }) + private Long sydId; + + //姓名 + @NotNull(message = "姓名不能为空", groups = { AddGroup.class }) + private String workName; + + //身份证 + @NotNull(message = "身份证不能为空", groups = { AddGroup.class }) + private String idCard; + + //手机号 + @NotNull(message = "手机号不能为空", groups = { AddGroup.class }) + private String phone; + + //业务类型 + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + //开户行名称 + @NotNull(message = "开户行名称不能为空", groups = { AddGroup.class }) + private String khh; + + //开户行名称 + @NotNull(message = "开户行账号不能为空", groups = { AddGroup.class }) + private String backCard; + + private String code; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //银行卡照片 + private String bankPic; + + //人脸照片 + private String facePic; + + private Long work_id; + + private String channelName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java new file mode 100644 index 0000000..b4a6456 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java @@ -0,0 +1,85 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 自雇者账户业务对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAccount.class, reverseConvertGenerate = false) +public class UserWorkerAccountBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "用工id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + @NotBlank(message = "预留手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + + private Integer status; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java new file mode 100644 index 0000000..bea1c41 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 授权协议业务对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAuthorized.class, reverseConvertGenerate = false) +public class UserWorkerAuthorizedBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + @NotNull(message = "签约状态(0:待签约 1:签约中 2:已签约 3:归档失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStatus; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 签约文件地址 + */ + @NotBlank(message = "签约文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signFileUrl; + + /** + * 协议签字图片 + */ + @NotBlank(message = "协议签字图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signPic; + + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String scaleName; + + + private String opName; + + private String workName; + + private String idCard; + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java new file mode 100644 index 0000000..645c16f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java @@ -0,0 +1,60 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 会员代发金额汇总表业务对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerBill.class, reverseConvertGenerate = false) +public class UserWorkerBillBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者ID + */ + @NotNull(message = "自雇者ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workerId; + + /** + * 服务商ID + */ + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + @NotNull(message = "业务类型 1 委托代征不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 年份 + */ + @NotBlank(message = "年份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dtmYear; + + /** + * 代发总金额 + */ + @NotNull(message = "代发总金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java new file mode 100644 index 0000000..238bddc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java @@ -0,0 +1,221 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.worker.domain.UserWorker; + +/** + * 自雇者业务对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorker.class, reverseConvertGenerate = false) +public class UserWorkerBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 微信openid + */ + @NotBlank(message = "微信openid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String openId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @NotNull(message = "银行卡是否认证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isAuthentication; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 身份证正面图片 + */ + @NotBlank(message = "身份证正面图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardPositive; + + /** + * 身份证反面图片 + */ + @NotBlank(message = "身份证反面图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardBack; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + @NotNull(message = "是否实名认证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @NotNull(message = "是否签约(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isSign; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @NotNull(message = "是否临时税务登记(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isRegister; + + /** + * 人脸照片 + */ + @NotBlank(message = "人脸照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String photoPath; + + /** + * 性别 + */ + @NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sex; + + /** + * 标签 + */ + @NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tag; + + /** + * 区域编码 + */ + @NotBlank(message = "区域编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String userArea; + + /** + * 区域名称 + */ + @NotBlank(message = "区域名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String userAreaName; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 民族 + */ + @NotBlank(message = "民族不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nation; + + /** + * 户籍地址 + */ + @NotBlank(message = "户籍地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 出生日期 + */ + @NotNull(message = "出生日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date birthday; + + /** + * 签发机关 + */ + @NotBlank(message = "签发机关不能为空", groups = { AddGroup.class, EditGroup.class }) + private String issue; + + /** + * 签发日期 + */ + @NotNull(message = "签发日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date issueDate; + + /** + * 失效日期 + */ + @NotBlank(message = "失效日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private String expiryDate; + + /** + * 推荐人 + */ + @NotBlank(message = "推荐人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @NotBlank(message = "支付宝登录号(支持邮箱和手机号格式)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @NotNull(message = "状态(1:启用 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + + private Long merId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java new file mode 100644 index 0000000..56bda87 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java @@ -0,0 +1,170 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 用工签约查询业务对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerBusiness.class, reverseConvertGenerate = false) +public class UserWorkerBusinessBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(0:待签约 1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStatus; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 签约文件地址 + */ + @NotBlank(message = "签约文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signFileUrl; + + /** + * 协议签字图片 + */ + @NotBlank(message = "协议签字图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signPic; + + /** + * 年代发金额所属年份 + */ + @NotBlank(message = "年代发金额所属年份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String moneyYearDate; + + /** + * 年代发金额 + */ + @NotNull(message = "年代发金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long moneyYear; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vPhone; + + /** + * 合同编码 + */ + @NotBlank(message = "合同编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signNo; + + /** + * 签约地址 + */ + @NotBlank(message = "签约地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signUrl; + + /** + * 预览地址 + */ + @NotBlank(message = "预览地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String webUrl; + + /** + * ossid + */ + @NotBlank(message = "ossid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ossid; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java new file mode 100644 index 0000000..87672cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java @@ -0,0 +1,32 @@ +package org.dromara.payment.worker.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title ImportResultVo + * @description 导入错误信息返回 + * @create 2024-04-28 11:12 + */ +@Data +public class ImportResultVo implements Serializable { + + + //总共1条,导入成功-0条,失败-1条 + private int cnt; + + //导入成功条数 + private int successCnt; + + //失败条数 + private int failCnt; + + //下载错误信息id + private String downId; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java new file mode 100644 index 0000000..d5d29b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java @@ -0,0 +1,32 @@ +package org.dromara.payment.worker.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title uploadExcelItem + * @description + * @create 2024-04-28 11:13 + */ + +@Data +public class UploadExcelItem implements Serializable { + + @ExcelProperty(value="姓名") + private String name; + + @ExcelProperty(value="身份证号") + private String idCard; + + @ExcelProperty(value="短信接收手机号") + private String phone; + + @ExcelProperty(value="错误信息") + private String errorMsg; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java new file mode 100644 index 0000000..0806f6c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java @@ -0,0 +1,117 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者账户视图对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAccount.class) +public class UserWorkerAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 银行卡照片 + */ + @ExcelProperty(value = "银行卡照片") + private String bankCardPic; + + + /** + * 预留手机号 + */ + @ExcelProperty(value = "预留手机号") + private String phone; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + private Integer status; + + private String phoneNoHide; + + public String getPhone() { + if(StringUtils.isNotEmpty(this.phone)){ + return StringUtils.phoneHide(this.phone); + }else{ + return "--"; + } + } + + public String getPhoneNoHide(){ + return this.phone; + } + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java new file mode 100644 index 0000000..bce70c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java @@ -0,0 +1,133 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 授权协议视图对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAuthorized.class) +public class UserWorkerAuthorizedVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待签约,1=:签约中,2=:已签约,3=:归档失败") + private Integer signStatus; + + private Date createTime; + + public String getSignStatusStr() { + if(this.signStatus != null){ + switch (this.signStatus){ + case 0: + return "未签约"; + case 1: + return "签约中"; + case 2: + return "已签约"; + case 3: + return "归档失败"; + default: + return "未签约"; + } + }else{ + return "未签约"; + } + } + + private String signStatusStr; + + + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 签约文件地址 + */ + @ExcelProperty(value = "签约文件地址") + private String signFileUrl; + + /** + * 协议签字图片 + */ + @ExcelProperty(value = "协议签字图片") + private String signPic; + + private String opName; + + private String workName; + + + public String getCardId() { + if(this.cardId != null){ + return StringUtils.idcardHide(this.cardId); + }else{ + return "--"; + } + } + + private String cardId; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java new file mode 100644 index 0000000..4be15d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java @@ -0,0 +1,68 @@ +package org.dromara.payment.worker.domain.vo; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 会员代发金额汇总表视图对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerBill.class) +public class UserWorkerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 自雇者ID + */ + @ExcelProperty(value = "自雇者ID") + private Long workerId; + + /** + * 服务商ID + */ + @ExcelProperty(value = "服务商ID") + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + @ExcelProperty(value = "业务类型 1 委托代征") + private Long busType; + + /** + * 年份 + */ + @ExcelProperty(value = "年份") + private String dtmYear; + + /** + * 代发总金额 + */ + @ExcelProperty(value = "代发总金额") + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java new file mode 100644 index 0000000..3ce71a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java @@ -0,0 +1,265 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 用工签约查询视图对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerBusiness.class) +public class UserWorkerBusinessVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + /** + * 自雇者id + */ +// @ExcelProperty(value = "自雇者id") + @ExcelIgnore + private Long workId; + + /** + * 结算中心id + */ +// @ExcelProperty(value = "结算中心id") + @ExcelIgnore + private Long sydId; + + /** + * 结算中心编号 + */ +// @ExcelProperty(value = "结算中心编号") + @ExcelIgnore + private String sydNo; + + + /** + * 运营商编号 + */ +// @ExcelProperty(value = "运营商编号") + @ExcelIgnore + private String opNo; + + /** + * 运营商id + */ +// @ExcelProperty(value = "运营商id") + @ExcelIgnore + private Long opId; + + /** + * 代理商id + */ +// @ExcelProperty(value = "代理商id") + @ExcelIgnore + private Long channelId; + + + /** + * 代理商编号 + */ +// @ExcelProperty(value = "代理商编号") + @ExcelIgnore + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @ExcelProperty(value = "代理商上下级关系编码") + @ExcelIgnore + private String channelCode; + + + /** + * 商户id + */ +// @ExcelProperty(value = "商户id") + @ExcelIgnore + private Long merId; + + /** + * 商户编号 + */ +// @ExcelProperty(value = "商户编号") + @ExcelIgnore + private String merNo; + + /** + * 合同编号 + */ +// @ExcelProperty(value = "合同编号") + @ExcelIgnore + private String no; + + + /** + * 签约时间 + */ +// @ExcelProperty(value = "签约时间") + @ExcelIgnore + private Date signTime; + + /** + * 签约文件地址 + */ +// @ExcelProperty(value = "签约文件地址") + @ExcelIgnore + private String signFileUrl; + + /** + * 协议签字图片 + */ +// @ExcelProperty(value = "协议签字图片") + @ExcelIgnore + private String signPic; + + /** + * 年代发金额所属年份 + */ +// @ExcelProperty(value = "年代发金额所属年份") + @ExcelIgnore + private String moneyYearDate; + + /** + * 年代发金额 + */ +// @ExcelProperty(value = "年代发金额") + @ExcelIgnore + private Long moneyYear; + + + + /** + * 签约地址 + */ +// @ExcelProperty(value = "签约地址") + @ExcelIgnore + private String signUrl; + + /** + * 预览地址 + */ +// @ExcelProperty(value = "预览地址" + @ExcelIgnore + private String webUrl; + + /** + * ossid + */ +// @ExcelProperty(value = "ossid") + @ExcelIgnore + private String ossid; + + + @ExcelProperty(value = "创建时间") + private Date createTime; + + @ExcelProperty(value = "用工姓名") + private String workName; + + + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 手机号 + */ + @ExcelIgnore + private String vPhone; + + + public String getPhoneStr() { + return this.getvPhone(); + } + + @ExcelProperty(value = "手机号") + private String phoneStr; + + + + @ExcelProperty(value = "企业名称") + private String busMerName; + + + @ExcelProperty(value = "服务商名称") + private String serviceName; + + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型" , converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType="wxfe_bus_type") + private Integer busType; + + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sign_status") + private Integer signStatus; + + + + + public String getvPhone() { + if(StringUtils.isNotEmpty(this.vPhone)){ + return StringUtils.phoneHide(this.vPhone); + }else{ + return "--"; + } + } + + + public String getvPhoneNoHide() { + return this.vPhone; + } + + @ExcelIgnore + private String phone; + + + public String getCardId() { + if(StringUtils.isNotEmpty(this.cardId)){ + return StringUtils.idcardHide(this.cardId); + }else{ + return "--"; + } + + } + + @ExcelIgnore + private String cardPositive; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java new file mode 100644 index 0000000..669183d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java @@ -0,0 +1,20 @@ +package org.dromara.payment.worker.domain.vo; + +import lombok.Data; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerNoHideVo + * @description + * @create 2024-05-12 6:15 + */ +@Data +public class UserWorkerNoHideVo extends UserWorkerVo{ + + private String cardIdNoHide; + + private String phoneNoHide; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java new file mode 100644 index 0000000..6e9d44c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java @@ -0,0 +1,299 @@ +package org.dromara.payment.worker.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.payment.worker.domain.UserWorker; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorker.class) +public class UserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + private Date createTime; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 微信openid + */ + @ExcelProperty(value = "微信openid") + private String openId; + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String name; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @ExcelProperty(value = "银行卡是否认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuthentication; + + public String getCardId() { + if (StringUtils.isNotBlank(cardId)) { + return StringUtils.idcardHide(cardId); + }else{ + return "--"; + } + } + + + public String getCardIdNoHide(){ + return this.cardId; + } + + + public String getPhoneNoHide(){ + return this.phone; + } + + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 身份证正面图片 + */ + @ExcelProperty(value = "身份证正面图片") + private String cardPositive; + + /** + * 身份证反面图片 + */ + @ExcelProperty(value = "身份证反面图片") + private String cardBack; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 是否实名认证(0:否 1:是) + */ + @ExcelProperty(value = "是否实名认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @ExcelProperty(value = "是否签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isSign; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @ExcelProperty(value = "是否临时税务登记", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isRegister; + + /** + * 人脸照片 + */ + @ExcelProperty(value = "人脸照片") + private String photoPath; + + /** + * 性别 + */ + @ExcelProperty(value = "性别") + private String sex; + + /** + * 标签 + */ + @ExcelProperty(value = "标签") + private String tag; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String userArea; + + /** + * 区域名称 + */ + @ExcelProperty(value = "区域名称") + private String userAreaName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 民族 + */ + @ExcelProperty(value = "民族") + private String nation; + + /** + * 户籍地址 + */ + @ExcelProperty(value = "户籍地址") + private String address; + + /** + * 出生日期 + */ + @ExcelProperty(value = "出生日期") + private Date birthday; + + /** + * 签发机关 + */ + @ExcelProperty(value = "签发机关") + private String issue; + + /** + * 签发日期 + */ + @ExcelProperty(value = "签发日期") + private Date issueDate; + + /** + * 失效日期 + */ + @ExcelProperty(value = "失效日期") + private String expiryDate; + + /** + * 推荐人 + */ + @ExcelProperty(value = "推荐人") + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:启用,2=:禁用") + private Integer status; + + /** + * 年代发金额所属年份 + */ + private String moneyYearDate; + + private Long workId; + + + private Long merId; + + /** + * 年代发金额 + */ + private Long moneyYear; + + + + private String statusStr; + + + public String getStatusStr() { + if(this.status != null){ + if(this.status == 1){ + return "已启用"; + }else{ + return "未启用"; + } + }else{ + return "--"; + } + } + + + public String getPhone() { + if(StringUtils.isNotEmpty(this.phone)){ + return StringUtils.phoneHide(this.phone); + }else{ + return "--"; + } + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java new file mode 100644 index 0000000..039c8cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java @@ -0,0 +1,27 @@ +package org.dromara.payment.worker.mapper; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + + +/** + * 自雇者账户Mapper接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface UserWorkerAccountMapper extends BaseMapperPlus { + + + /*** + * 根据用工id,通道,银行卡号查询银行卡信息 + * @param bo + * @return + */ + public List selctBankInfoByUidChannelBankNo(UserWokerOperBo bo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java new file mode 100644 index 0000000..6f954ea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java @@ -0,0 +1,37 @@ +package org.dromara.payment.worker.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 授权协议Mapper接口 + * + * @author LionLi + * @date 2024-04-29 + */ +public interface UserWorkerAuthorizedMapper extends BaseMapperPlus { + + + /*** + * 查询授权协议列表 + * @param page + * @param wrapper + * @return + */ + Page selUserWorkerAuthorList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 查询授权协议详情 + * @param auBo + * @return + */ + UserWorkerAuthorizedVo selUserWorkerAuthorInfo(UserWorkerAuthorizedBo auBo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java new file mode 100644 index 0000000..195318b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java @@ -0,0 +1,24 @@ +package org.dromara.payment.worker.mapper; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.payment.worker.domain.vo.UserWorkerBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 会员代发金额汇总表Mapper接口 + * + * @author LionLi + * @date 2024-09-03 + */ +public interface UserWorkerBillMapper extends BaseMapperPlus { + + + public List selectCurentDayWorkerBillInfo(Map paraMap); + + + + public int deleteUserWorkerBillByInfo(Map paraMap); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java new file mode 100644 index 0000000..3bc5bf8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java @@ -0,0 +1,124 @@ +package org.dromara.payment.worker.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; + +import java.util.List; +import java.util.Map; + +/** + * 用工签约查询Mapper接口 + * + * @author LionLi + * @date 2024-04-26 + */ +public interface UserWorkerBusinessMapper extends BaseMapperPlus { + + + /*** + * 用工签约查询 + * @param page + * @param wrapper + * @return + */ + Page selUserWorkSignLists(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + /*** + * 用工签约查询 ,不分页 + * @param wrapper + * @return + */ + List selUserWorkSignLists( @Param(Constants.WRAPPER) Wrapper wrapper); + + + + + /*** + * 根据签约id,查询用工签约详情 + * @param id + * @return + */ + UserWorkerBusinessVo selUserWorkDetail(Long id); + + + /*** + * 更新用工信息 + * @param userWorkerBo + * @return + */ + int updateUserWorkByCardId(UserWorkerBo userWorkerBo); + + /*** + * 更新用工信息 + * @param uwbo + * @return + */ + int updateUserWorkBisByWorkId(UserWorkerBusinessBo uwbo); + +// int updateUserWorkByPhone(UserWorkerBo userWorkerBo); + + + /*** + * 根据身份证查询用工信息 + * @param merId + * @param cardId + * @return + */ + UserWorkerBusinessVo selUserWorkByIdCard(@Param("merId")Long merId,@Param("cardId")String cardId,@Param("busType")Integer busType,@Param("sydId")Long sydId); + + + /*** + * 簽約信息查詢會員信息 + * @param bo + * @return + */ + UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo); + + + /*** + * 根据服务商ID,获取签约默认渠道 + * @param sydId + * @return + */ + String selSydDefaultChannel(Long sydId); + + + Page selUserWorkByMerServInfo(@Param("page") IPage page, + @Param("merId")Long merId, + @Param("sydId")Long sydId, + @Param("workIds")String workIds, + @Param("busType")Integer busType); + + + List selUserWorkByMerServInfo( + @Param("merId")Long merId, + @Param("sydId")Long sydId, + @Param("workIds")String workIds, + @Param("busType")Integer busType); + + + + List selUserWorkBizByCon(Map map); + + + /**** + * 根据自雇者id,服务商id,业务类型查询签约信息 + * @param map + * @return + */ + List selUserWorkBizByWorkIdSydIdBusType(Map map); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java new file mode 100644 index 0000000..45b22ce --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.worker.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; + +import java.util.List; + +/** + * 自雇者Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface UserWorkerMapper extends BaseMapperPlus { + /** + * 根据身份证号查询自雇者信息 + * @param cardIds 身份证号列表 + * @param passage 结算通道 + * @param sydId 签约服务商id + * @param merId 签约商户id + * @return + */ + List selectByCardId(@Param("cardIds") List cardIds, @Param("passage") String passage,@Param("sydId") Long sydId, + @Param("merId") Long merId,@Param("busType")Integer busType); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java new file mode 100644 index 0000000..697fdba --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java @@ -0,0 +1,86 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.ThirdConf; + +/** + * @author sunzexing + * @version 1.0 + * @title IIdCardAndOtherService + * @description 身份证,银行卡验证等三方接口 + * @create 2024-04-28 16:31 + */ +public interface IIdCardAndOtherService { + + + + /*** + * 身份证二要素认证 + * @param name + * @param idCard + * @throws Exception + */ + boolean cardId2(String name, String idCard, String code) throws Exception; + + + /*** + * 银行卡四要素认证 + * @param bankCard + * @param name + * @param phone + * @param idCard + * @return + * @throws Exception + */ + boolean bankCard4(String bankCard,String name,String phone,String idCard,String code)throws Exception; + + + /*** + * 银行卡三要素认证 + * @param bankCard + * @param name + * @param idCard + * @return + * @throws Exception + */ + boolean bankCard3(String bankCard,String name,String idCard,String code)throws Exception; + + + + /*** + * 身份证二要素认证 + * @param name + * @param idCard + * @param config + * @return + * @throws Exception + */ + boolean cardId2(String name, String idCard, ThirdConf config) throws Exception; + + + /*** + * 银行卡四要素认证 + * @param bankCard + * @param name + * @param phone + * @param idCard + * @param conf + * @return + * @throws Exception + */ + boolean bankCard4(String bankCard,String name,String phone,String idCard,ThirdConf conf)throws Exception; + + + /*** + * 银行卡三要素认证 + * @param bankCard + * @param name + * @param idCard + * @param conf + * @return + * @throws Exception + */ + boolean bankCard3(String bankCard,String name,String idCard,ThirdConf conf)throws Exception; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java new file mode 100644 index 0000000..54e3af3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java @@ -0,0 +1,57 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者账户Service接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface IUserWorkerAccountService { + + /** + * 查询自雇者账户 + */ + UserWorkerAccountVo queryById(Long id); + + /** + * 查询自雇者账户列表 + */ + TableDataInfo queryPageList(UserWorkerAccountBo bo, PageQuery pageQuery); + + /** + * 查询自雇者账户列表 + */ + List queryList(UserWorkerAccountBo bo); + + /** + * 新增自雇者账户 + */ + Boolean insertByBo(UserWorkerAccountBo bo); + + /** + * 修改自雇者账户 + */ + Boolean updateByBo(UserWorkerAccountBo bo); + + /** + * 校验并批量删除自雇者账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /**** + * 账单补发,修改自雇者银行卡信息 + * @param bo + * @return + */ + UserWorkerAccount rePayMdyWorkerBank(UserWorkerAccountBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java new file mode 100644 index 0000000..77de8ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 授权协议Service接口 + * + * @author LionLi + * @date 2024-04-29 + */ +public interface IUserWorkerAuthorizedService { + + /** + * 查询授权协议 + */ + UserWorkerAuthorizedVo queryById(Long id); + + /** + * 查询授权协议列表 + */ + TableDataInfo queryPageList(UserWorkerAuthorizedBo bo, PageQuery pageQuery); + + /** + * 查询授权协议列表 + */ + List queryList(UserWorkerAuthorizedBo bo); + + /** + * 新增授权协议 + */ + Boolean insertByBo(UserWorkerAuthorizedBo bo); + + /** + * 修改授权协议 + */ + Boolean updateByBo(UserWorkerAuthorizedBo bo); + + /** + * 校验并批量删除授权协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java new file mode 100644 index 0000000..243fd4d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java @@ -0,0 +1,124 @@ +package org.dromara.payment.worker.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.List; + +/** + * 用工签约查询Service接口 + * + * @author LionLi + * @date 2024-04-26 + */ +public interface IUserWorkerBusinessService { + + + /*** + * 查询企业在所选服务商中未签约的用工者信息 + * @param pageQuery + * @param sydId + * @param merId + * @param busType + * @return + */ + TableDataInfo selUserWorkByMerServInfo(PageQuery pageQuery, Long sydId,Long merId,Integer busType); + + /** + * 查询用工签约查询 + */ + UserWorkerBusinessVo queryById(Long id); + + /** + * 查询用工签约查询列表 + */ + TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery); + + /** + * 查询用工签约查询列表 + */ + List queryList(CommonSelConditionEntity bo); + + /** + * 新增用工签约查询 + */ + Boolean insertByBo(UserWorkerBusinessBo bo); + + /** + * 修改用工签约查询 + */ + Boolean updateByBo(UserWorkerBusinessBo bo); + + /** + * 校验并批量删除用工签约查询信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /*** + * 用工签约导入 + * @param file + * @return + */ + ImportResultVo upload(MultipartFile file, Integer busType, Long sydId,String sydNo,String code,Long merId,String merNo)throws Exception; + + + /*** + * 下载错误信息 + * @param uuid + */ + List selErrorList(String uuid); + + + /*** + * 根據簽約信息,查詢對應的會員信息 + * @param bo + * @return + */ + UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo); + + + /*** + * 添加用戶-运营商 + * @param bo + * @return + */ + Boolean addUserWorkdBz(UserWokerOperBo bo) throws Exception; + + + + Boolean operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds); + + + Boolean operAddUserWorkAll(Long merId, Long sydId, Integer busType); + + + Boolean updateUserWorkInfo(UserWorkerBo uw); + + + UserWorkerNoHideVo selMemberInfoNySignId(UserWorkerBusinessBo bo ); + + + /*** + * 单个导出用工的身份证信息 + * @param workId + * @param response + */ + void exportCardImg(Long workId, HttpServletResponse response)throws Exception; + + /**** + * 批量导出用工者身份证信息 + * @param workIds + */ + void exportMutiCardImg(String workIds) throws Exception; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java new file mode 100644 index 0000000..1a83f91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者Service接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface IUserWorkerService { + + /** + * 查询自雇者 + */ + UserWorkerVo queryById(Long id); + + /** + * 查询自雇者列表 + */ + TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery); + + /** + * 查询自雇者列表 + */ + List queryList(UserWorkerBo bo); + + /** + * 新增自雇者 + */ + Boolean insertByBo(UserWorkerBo bo); + + /** + * 修改自雇者 + */ + Boolean updateByBo(UserWorkerBo bo); + + /** + * 校验并批量删除自雇者信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java new file mode 100644 index 0000000..6696c95 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java @@ -0,0 +1,197 @@ +package org.dromara.payment.worker.service.impl; + +import com.tencentcloudapi.common.profile.ClientProfile; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.MpContants; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.payment.worker.domain.SysUnitDomain; +import org.dromara.payment.worker.domain.ThirdConf; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.faceid.v20180301.FaceidClient; +import com.tencentcloudapi.faceid.v20180301.models.*; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title IdCardAndOtherServiceImpl + * @description + * @create 2024-04-28 16:36 + */ +@Service +@Slf4j +public class TencentIdCardAndOtherServiceImpl extends BaseService implements IIdCardAndOtherService { + + + @DubboReference + private RemoteConfigService remoteConfigService; + + + @Override + public boolean cardId2(String name, String idCard, String code) throws Exception { + ThirdConf tc = this.getThirdConfig(code,"idcardAuthConfig"); + return this.cardId2(name,idCard,tc); + } + + @Override + public boolean bankCard4(String bankCard, String name, String phone, String idCard, String code) throws Exception { + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + return this.bankCard4(bankCard,name,phone,idCard,tc); + } + + @Override + public boolean bankCard3(String bankCard, String name, String idCard, String code) throws Exception { + return this.bankCard4(bankCard,name,null,idCard,code); + } + + @Override + public boolean cardId2(String name, String idCard, ThirdConf config) throws Exception { + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IdCardVerificationRequest req = new IdCardVerificationRequest(); + + req.setName(name); + req.setIdCard(idCard); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IdCardVerificationResponse resp = client.IdCardVerification(req); + log.info("身份证二要素识姓名:["+name+"],idcard["+idCard+"]别返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + }catch(TencentCloudSDKException e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw new BaseException(e.getMessage()) ; + }catch (Exception e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + } + } + + @Override + public boolean bankCard4(String bankCard, String name, String phone, String idCard, ThirdConf conf) throws Exception { + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + + if(StringUtils.isNotEmpty(phone)){ + BankCard4EVerificationRequest req = new BankCard4EVerificationRequest(); + req.setName(name); + req.setBankCard(bankCard); + req.setIdCard(idCard); + req.setPhone(phone); + // 返回的resp是一个BankCard4EVerificationResponse的实例,与请求对象对应 + BankCard4EVerificationResponse resp = client.BankCard4EVerification(req); + log.info("银行卡四要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + }else{ + BankCardVerificationRequest req = new BankCardVerificationRequest(); + req.setIdCard(idCard); + req.setName(name); + req.setBankCard(bankCard); + BankCardVerificationResponse resp = client.BankCardVerification(req); + log.info("银行卡三要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + } + } catch (TencentCloudSDKException e) { + log.error("银行卡三/四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},状态码{},错误信息{}",phone,name,idCard,bankCard,e.getErrorCode(),e.getMessage()); + throw e; + } catch(Exception e){ + e.printStackTrace(); + log.error("银行卡三/四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},错误信息{}",phone,name,idCard,bankCard,e.getMessage()); + throw e; + } + } + + + + @Override + public boolean bankCard3(String bankCard, String name, String idCard, ThirdConf conf) throws Exception { + return this.bankCard4(bankCard,name,null,idCard,conf); + } + + + public ThirdConf getThirdConfig(String code,String type ){ + + Map configMap = this.mpOtherThirdConfig(code); + if(configMap == null){ + throw new RuntimeException("站点第三方参数未配置!"); + } + Map subMap = (Map) configMap.get(type); + ThirdConf thirdConf = JsonUtils.parseObject(JsonUtils.toJsonString(subMap),ThirdConf.class); + return thirdConf; + } + + public Map mpOtherThirdConfig(String domainCode) { + + + RemoteSysUnitDomainVo unitDomainVo = this.remoteConfigService.queryByDomainName(domainCode); + + if(unitDomainVo == null){ + this.invalidationParamsException("此站点无配置-身份证识别等"); + } + String thirdConfigStr = unitDomainVo.getWeChatThirdParams(); + return JsonUtils.parseObject(thirdConfigStr,Map.class); +// String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; +// Object obj = RedisUtils.getCacheObject(cacheKey); +// Map map = JsonUtils.parseObject(JsonUtils.toJsonString(obj),Map.class); +// SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); +// if(mpDomainVo != null){ +// String thirdConfigStr = mpDomainVo.getWeChatThirdParams(); +// return JsonUtils.parseObject(thirdConfigStr,Map.class); +// } +// return null; + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java new file mode 100644 index 0000000..8404681 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java @@ -0,0 +1,304 @@ +package org.dromara.payment.worker.service.impl; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.service.IUserWorkerAccountService; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerAccountServiceImpl extends BaseService implements IUserWorkerAccountService { + + private final UserWorkerAccountMapper baseMapper; + + @DubboReference + private RemoteAccountService accountService; + @Resource + private UserWorkerMapper userWorkerMapper; + /** + * 查询自雇者账户 + */ + @Override + public UserWorkerAccountVo queryById(Long id){ + UserWorkerAccountVo vo = baseMapper.selectVoById(id); + return vo; + } + + /** + * 查询自雇者账户列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerAccountBo bo, PageQuery pageQuery) { + bo.setStatus(1); + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者账户列表 + */ + @Override + public List queryList(UserWorkerAccountBo bo) { + + if(bo.getWorkId() == null){ + this.invalidationParamsException("用工ID不能为空"); + } + + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getWorkId() != null, "work_id", bo.getWorkId()); + lqw.eq(bo.getAccId() != null, "acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getIsDefault() != null, "is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCardPic()), "bank_card_pic", bo.getBankCardPic()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "passage", bo.getPassage()); + lqw.orderByDesc("create_time"); + return lqw; + } + + /** + * 新增自雇者账户 + */ + @Override + public Boolean insertByBo(UserWorkerAccountBo bo) { + UserWorkerAccount add = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(add); + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWorkId()); + bno.setChannelName(bo.getPassage()); + List accountVo = this.baseMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo selVo = null; + + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + } + if(vo.getBankCard().equals(bo.getBankCard())){ + cz = true; + selVo = vo; + } + } + } + + if(cz){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setPhone(bo.getPhone()); + this.baseMapper.updateById(uwab); + }else if(!cz){ + + UserWorker uw = this.userWorkerMapper.selectById(bo.getWorkId()); + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBankCard()); + bankAcc.setBankType(bo.getBankType()); + bankAcc.setUnitId(0L); + bankAcc.setName(uw.getName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWorkId()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBankCard()); + uwab.setPassage(bo.getPassage()); + uwab.setBankType(bo.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setPhone(bo.getPhone()); + uwab.setCreateBy(LoginHelper.getUserId()); + if(!isDefault){ + uwab.setIsDefault(1L); + }else{ + uwab.setIsDefault(0L); + } + this.baseMapper.insert(uwab); + } + return true; + } + + /** + * 修改自雇者账户 + */ + @Override + public Boolean updateByBo(UserWorkerAccountBo bo) { + UserWorkerAccount update = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(update); + update.setUpdateBy(LoginHelper.getUserId()); + update.setCreateTime(new Date()); + + UserWorkerAccountVo uwav = this.baseMapper.selectVoById(bo.getId()); + if(uwav != null){ + if(uwav.getBankCard().equals(bo.getBankCard())){ + baseMapper.updateById(update); + }else{ + UserWorkerAccount b = new UserWorkerAccount(); + b.setId(bo.getId()); + b.setStatus(0); + baseMapper.updateById(b); + this.insertByBo(bo); + } + } + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public UserWorkerAccount rePayMdyWorkerBank(UserWorkerAccountBo bo) { + UserWorkerAccount add = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(add); + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWorkId()); + bno.setChannelName(bo.getPassage()); + List accountVo = this.baseMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo defaultVo = null; + UserWorkerAccountVo selVo = null; + + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + defaultVo = vo; + } + if(vo.getBankCard().equals(bo.getBankCard())){ + cz = true; + selVo = vo; + } + } + } + + if(defaultVo != null){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(defaultVo.getId()); + uwab.setIsDefault(0L); + this.baseMapper.updateById(uwab); + } + + if(cz){ + + + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setIsDefault(1L); + uwab.setPhone(bo.getPhone()); + this.baseMapper.updateById(uwab); + uwab.setAccId(selVo.getAccId()); + uwab.setBankType(selVo.getBankType()); + uwab.setBankCard(selVo.getBankCard()); + uwab.setWorkId(selVo.getWorkId()); + return uwab; + }else if(!cz){ + + UserWorker uw = this.userWorkerMapper.selectById(bo.getWorkId()); + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBankCard()); + bankAcc.setBankType(bo.getBankType()); + bankAcc.setUnitId(0L); + bankAcc.setName(uw.getName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + if(defaultVo != null){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(defaultVo.getId()); + uwab.setIsDefault(0L); + this.baseMapper.updateById(uwab); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWorkId()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBankCard()); + uwab.setPassage(bo.getPassage()); + uwab.setBankType(bo.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setPhone(bo.getPhone()); + uwab.setCreateBy(LoginHelper.getUserId()); + uwab.setIsDefault(1L); +// if(!isDefault){ +// uwab.setIsDefault(1L); +// }else{ +// uwab.setIsDefault(0L); +// } + this.baseMapper.insert(uwab); + + return uwab; + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java new file mode 100644 index 0000000..35c48f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java @@ -0,0 +1,128 @@ +package org.dromara.payment.worker.service.impl; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.mapper.UserWorkerAuthorizedMapper; +import org.dromara.payment.worker.service.IUserWorkerAuthorizedService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 授权协议Service业务层处理 + * + * @author LionLi + * @date 2024-04-29 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerAuthorizedServiceImpl extends BaseService implements IUserWorkerAuthorizedService { + + private final UserWorkerAuthorizedMapper baseMapper; + + /** + * 查询授权协议 + */ + @Override + public UserWorkerAuthorizedVo queryById(Long id){ + if(id == null){ + this.invalidationParamsException("签约ID不能为空"); + } + UserWorkerAuthorizedBo bo = new UserWorkerAuthorizedBo(); + bo.setId(id); + return baseMapper.selUserWorkerAuthorInfo(bo); + } + + /** + * 查询授权协议列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerAuthorizedBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selUserWorkerAuthorList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询授权协议列表 + */ + @Override + public List queryList(UserWorkerAuthorizedBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerAuthorizedBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getOpName()),"t2.name",bo.getOpName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.like(StringUtils.isNotEmpty(bo.getIdCard()),"t1.card_id",bo.getIdCard()); + lqw.eq(bo.getSignStatus() != null, "sign_status", bo.getSignStatus()); + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "no", bo.getNo()); + lqw.orderByDesc("t.create_time"); + return lqw; + } + + /** + * 新增授权协议 + */ + @Override + public Boolean insertByBo(UserWorkerAuthorizedBo bo) { + UserWorkerAuthorized add = MapstructUtils.convert(bo, UserWorkerAuthorized.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改授权协议 + */ + @Override + public Boolean updateByBo(UserWorkerAuthorizedBo bo) { + UserWorkerAuthorized update = MapstructUtils.convert(bo, UserWorkerAuthorized.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerAuthorized entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除授权协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java new file mode 100644 index 0000000..5058b24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java @@ -0,0 +1,941 @@ +package org.dromara.payment.worker.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.IdcardUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.taxRecords.service.impl.AsyncTaxRecordsService; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.dromara.payment.worker.service.IUserWorkerBusinessService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用工签约查询Service业务层处理 + * + * @author LionLi + * @date 2024-04-26 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerBusinessServiceImpl extends BaseService implements IUserWorkerBusinessService { + + private final UserWorkerBusinessMapper baseMapper; + + + @DubboReference + private RemoteDictService remoteDictService; + + @Resource + private BusMerchantMapper busMerchantMapper; + + @Resource + private UserWorkerMapper userWorkerMapper; + + @Resource + private SysSydMapper sysSydMapper; + + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + + @DubboReference + private RemoteAccountService accountService; + + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + @Resource(name="tencentIdCardAndOtherServiceImpl") + public IIdCardAndOtherService tencentIdCardAndOtherService; + + + + @Resource + public AsyncTaxRecordsService asyncTaxRecordsService; + + + @Override + public TableDataInfo selUserWorkByMerServInfo(PageQuery pageQuery, Long sydId, Long merId, Integer busType) { + Page result = baseMapper.selUserWorkByMerServInfo(pageQuery.build(),merId,sydId,null,busType); + return TableDataInfo.build(result); + } + + /** + * 查询用工签约查询 + */ + @Override + public UserWorkerBusinessVo queryById(Long id){ + return baseMapper.selUserWorkDetail(id); + } + + /** + * 查询用工签约查询列表 + */ + @Override + public TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getSignStatus() != null, "t.sign_status", bo.getSignStatus()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkPhone()),"t.v_phone",bo.getWorkPhone()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.eq(StringUtils.isNotEmpty(bo.getBusMerName()), "t2.name", bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkIdCard()),"t1.card_id",bo.getWorkIdCard()); + lqw.eq(bo.getSydId() != null ,"t.syd_id",bo.getSydId()); + lqw.eq(bo.getBusType() != null,"t.bus_type",bo.getBusType()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq("t.mer_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("op_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq("t.syd_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selUserWorkSignLists(pageQuery.build(),lqw); + return TableDataInfo.build(result); + } + + /** + * 查询用工签约查询列表 + */ + @Override + public List queryList(CommonSelConditionEntity bo) { + QueryWrapper lqw = new QueryWrapper<>(); + + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getSignStatus() != null, "t.sign_status", bo.getSignStatus()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkPhone()),"t.v_phone",bo.getWorkPhone()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.eq(StringUtils.isNotEmpty(bo.getBusMerName()), "t2.name", bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkIdCard()),"t1.card_id",bo.getWorkIdCard()); + lqw.eq(bo.getBusType() != null,"t.bus_type",bo.getBusType()); + lqw.eq(bo.getSydId() != null ,"t.syd_id",bo.getSydId()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq("t.mer_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("op_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq(bo.getSydId() != null ,"t.syd_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + + return baseMapper.selUserWorkSignLists(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerBusinessBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getWorkId() != null, "work_id", bo.getWorkId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "no", bo.getNo()); + lqw.eq(bo.getSignStatus() != null, "sign_status", bo.getSignStatus()); + lqw.eq(bo.getSignTime() != null, "sign_time", bo.getSignTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSignFileUrl()), "sign_file_url", bo.getSignFileUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getSignPic()), "sign_pic", bo.getSignPic()); + lqw.eq(StringUtils.isNotBlank(bo.getMoneyYearDate()), "money_year_date", bo.getMoneyYearDate()); + lqw.eq(bo.getMoneyYear() != null, "money_year", bo.getMoneyYear()); + lqw.eq(StringUtils.isNotBlank(bo.getVPhone()), "v_phone", bo.getVPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getSignNo()), "sign_no", bo.getSignNo()); + lqw.eq(StringUtils.isNotBlank(bo.getSignUrl()), "sign_url", bo.getSignUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getWebUrl()), "web_url", bo.getWebUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getOssid()), "ossid", bo.getOssid()); + return lqw; + } + + /** + * 新增用工签约查询 + */ + @Override + public Boolean insertByBo(UserWorkerBusinessBo bo) { + UserWorkerBusiness add = MapstructUtils.convert(bo, UserWorkerBusiness.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改用工签约查询 + */ + @Override + public Boolean updateByBo(UserWorkerBusinessBo bo) { + UserWorkerBusiness update = MapstructUtils.convert(bo, UserWorkerBusiness.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerBusiness entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除用工签约查询 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + /*** + * 用工签约导入 + * @param file + * @busType 业务类型 + * @sydId 服务商编码 + * @return + */ + @Override + public ImportResultVo upload(MultipartFile file, Integer busType, Long sydId,String sydNo,String code,Long merId,String merNo) throws Exception { + + ImportResultVo vo = new ImportResultVo(); + + if(file == null || file.isEmpty()){ + this.invalidationParamsException("不能上传空文件"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商id不能为空"); + } + + + + if(StringUtils.isEmpty(sydNo)){ + this.invalidationParamsException("服务商编码不能为空"); + } + + + if(StringUtils.isEmpty(code)){ + this.invalidationParamsException("域名不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + merId = LoginHelper.getBusId(); + merNo = LoginHelper.getNo(); + }else{ + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(StringUtils.isEmpty(merNo)){ + this.invalidationParamsException("企业编码不能为空"); + } + + } + + + try{ + + + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setNo(merNo); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + ExcelListener listener = new ExcelListener(); + EasyExcel.read(file.getInputStream(), UploadExcelItem.class,listener).headRowNumber(3).sheet().doRead(); + List excelList = listener.getList(); + List passlist = new ArrayList<>(); + List userWorkerList = new ArrayList<>(); + List nopassList = new ArrayList<>(); + for(UploadExcelItem item :excelList){ + + if(!PhoneUtil.isPhone(item.getPhone())){ + item.setErrorMsg("手机号校验不通过"); + nopassList.add(item); + continue; + } + if(!IdcardUtil.isValidCard(item.getIdCard())){ + item.setErrorMsg("身份证号校验不通过"); + nopassList.add(item); + continue; + } + UserWorkerBusinessVo userWorker = this.baseMapper.selUserWorkByIdCard(LoginHelper.getBusId(),item.getIdCard(),busType,sydId); + if(userWorker != null){ + if(!item.getName().equals(userWorker.getWorkName())){ + item.setErrorMsg("导入信息与系统已有信息不一致"); + nopassList.add(item); + continue; + } + + if(userWorker.getPhone() != null && !item.getPhone().equals(userWorker.getPhone()) ){ + item.setErrorMsg("导入信息与系统已有信息不一致"); + nopassList.add(item); + continue; + } + + if(userWorker.getPhone() != null){ + item.setErrorMsg("导入用工信息已经存在!"); + nopassList.add(item); + continue; + } + + + + }else{ + try{ + this.tencentIdCardAndOtherService.cardId2(item.getName(),item.getIdCard(),code); + }catch(BaseException e ){ + item.setErrorMsg("身份证校验不通过,"+e.getMessage()); + nopassList.add(item); + continue; + } + } + + if(userWorker != null){ + UserWorkerBusiness userWorkerBusinessBo = new UserWorkerBusiness(); + userWorkerBusinessBo.setWorkId(userWorker.getWorkId()); + userWorkerBusinessBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBusinessBo.setCreateTime(new Date()); + userWorkerBusinessBo.setBusType(busType); + userWorkerBusinessBo.setSydId(sydId); + userWorkerBusinessBo.setSydNo(sydNo); + userWorkerBusinessBo.setMerId(merId); + userWorkerBusinessBo.setMerNo(merNo); + userWorkerBusinessBo.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusinessBo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusinessBo.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusinessBo.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusinessBo.setSignStatus(0); + userWorkerBusinessBo.setVPhone(item.getPhone()); + passlist.add(userWorkerBusinessBo); + }else{ + long id = IdUtil.getSnowflakeNextId(); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + userWorkerBo.setName(item.getName()); + userWorkerBo.setCardId(item.getIdCard()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCreateTime(new Date()); + userWorkerList.add(userWorkerBo); + UserWorkerBusiness userWorkerBusiness = new UserWorkerBusiness(); + userWorkerBusiness.setWorkId(id); + userWorkerBusiness.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusiness.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusiness.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusiness.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusiness.setCreateBy(LoginHelper.getUserId()); + userWorkerBusiness.setSydId(sydId); + userWorkerBusiness.setSydNo(sydNo); + userWorkerBusiness.setMerId(merId); + userWorkerBusiness.setMerNo(merNo); + userWorkerBusiness.setCreateTime(new Date()); + userWorkerBusiness.setBusType(busType); + userWorkerBusiness.setSignStatus(0); + userWorkerBusiness.setVPhone(item.getPhone()); + passlist.add(userWorkerBusiness); + } + } + + vo.setCnt(excelList.size()); + vo.setFailCnt(nopassList.size()); + vo.setSuccessCnt(passlist.size()); + + if(!nopassList.isEmpty()){ + String uuid = UUID.fastUUID().toString(); + vo.setDownId(uuid); + RedisUtils.setCacheObject(GlobalConstants.USERWORK_SIGN_ERROR_KEY+uuid,nopassList, Duration.ofDays(15)); + } + + if(!passlist.isEmpty()){ + this.isSign(passlist,sydId,busType); + this.baseMapper.insertBatch(passlist); + } + if(!userWorkerList.isEmpty()){ + this.userWorkerMapper.insertBatch(userWorkerList); + } + + }catch (Exception e){ + e.printStackTrace(); + throw e ; + } + + return vo; + } + + @Override + public List selErrorList(String uuid) { + if(StringUtils.isEmpty(uuid)){ + return new ArrayList<>(); + } + List list = RedisUtils.getCacheObject(GlobalConstants.USERWORK_SIGN_ERROR_KEY+uuid); + if(list == null){ + return new ArrayList<>(); + } + return list; + } + + @Override + public UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo) { + if(bo.getId() == null){ + this.invalidationParamsException("用工签约ID不能为空"); + } + UserWorkerVo vo = this.baseMapper.selMemberInfo(bo); + return vo; + } + + + + + + /*** + * 添加用戶-运营商 + * @param bo + * @return + */ + @Override + @Transactional + public Boolean addUserWorkdBz(UserWokerOperBo bo) throws Exception{ + + if(!PhoneUtil.isPhone(bo.getPhone())){ + this.invalidationParamsException("手机号校验不通过"); + } + if(!IdcardUtil.isValidCard(bo.getIdCard())){ + this.invalidationParamsException("身份证校验不通过"); + } + UserWorkerBusinessVo userWorker = this.baseMapper.selUserWorkByIdCard(bo.getMerId(),bo.getIdCard(),bo.getBusType(),bo.getSydId()); + if(userWorker != null){ + if(!bo.getWorkName().equals(userWorker.getWorkName())){ + this.invalidationParamsException("添加信息与系统已有信息不一致"); + } + + if(userWorker.getPhone() != null && !bo.getPhone().equals(userWorker.getPhone())){ + this.invalidationParamsException("添加信息与系统已有信息不一致"); + } + + if(userWorker.getPhone() != null){ + this.invalidationParamsException("添加信息已经存在"); + } + + }else{ + try{ + this.tencentIdCardAndOtherService.cardId2(bo.getWorkName(),bo.getIdCard(),bo.getCode()); + }catch(BaseException e ){ + this.invalidationParamsException("身份证校验不通过,"+e.getMessage()); + throw e; + } + } + + try{ + this.tencentIdCardAndOtherService.bankCard3(bo.getBackCard(),bo.getWorkName(),bo.getIdCard(),bo.getCode()); + }catch(BaseException e ){ + this.invalidationParamsException("银行卡校验不通过,"+e.getMessage()); + throw e; + } + + + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(bo.getMerId()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + if(userWorker != null){ + UserWorkerBusiness userWorkerBusinessBo = new UserWorkerBusiness(); + userWorkerBusinessBo.setWorkId(userWorker.getWorkId()); + bo.setWork_id(userWorker.getWorkId()); + userWorkerBusinessBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBusinessBo.setCreateTime(new Date()); + userWorkerBusinessBo.setBusType(bo.getBusType()); + userWorkerBusinessBo.setSydId(bo.getSydId()); + userWorkerBusinessBo.setSydNo(bo.getSydNo()); + userWorkerBusinessBo.setMerNo(bo.getMerNo()); + userWorkerBusinessBo.setMerId(bo.getMerId()); + userWorkerBusinessBo.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusinessBo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusinessBo.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusinessBo.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusinessBo.setSignStatus(0); + userWorkerBusinessBo.setVPhone(bo.getPhone()); + this.baseMapper.insert(userWorkerBusinessBo); + + UserWorker userWorkerBo = new UserWorker(); + boolean updateStatus = false; + if(StringUtils.isNotEmpty(bo.getCardPositive())){ + userWorkerBo.setCardPositive(bo.getCardPositive()); + updateStatus = true; + } + if(StringUtils.isNotEmpty(bo.getCardBack())){ + userWorkerBo.setCardBack(bo.getCardBack()); + updateStatus = true; + } + + if(StringUtils.isNotEmpty(bo.getFacePic())){ + userWorkerBo.setPhotoPath(bo.getFacePic()); + updateStatus = true; + } + + if(updateStatus){ + userWorkerBo.setId(userWorker.getWorkId()); + this.userWorkerMapper.updateById(userWorkerBo); + } + + }else{ + + long id = IdUtil.getSnowflakeNextId(); + bo.setWork_id(id); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + userWorkerBo.setName(bo.getWorkName()); + userWorkerBo.setCardId(bo.getIdCard()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCardPositive(bo.getCardPositive()); + userWorkerBo.setCardBack(bo.getCardBack()); + userWorkerBo.setPhotoPath(bo.getFacePic()); + userWorkerBo.setCreateTime(new Date()); + this.userWorkerMapper.insert(userWorkerBo); + UserWorkerBusiness userWorkerBusiness = new UserWorkerBusiness(); + userWorkerBusiness.setWorkId(id); + userWorkerBusiness.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusiness.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusiness.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusiness.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusiness.setCreateBy(LoginHelper.getUserId()); + userWorkerBusiness.setSydId(bo.getSydId()); + userWorkerBusiness.setSydNo(bo.getSydNo()); + userWorkerBusiness.setMerNo(bo.getMerNo()); + userWorkerBusiness.setMerId(bo.getMerId()); + userWorkerBusiness.setCreateTime(new Date()); + userWorkerBusiness.setBusType(bo.getBusType()); + userWorkerBusiness.setSignStatus(0); + userWorkerBusiness.setVPhone(bo.getPhone()); + this.baseMapper.insert(userWorkerBusiness); + } + dwUserWorkBank(bo); + return true; + } + + @Override + public Boolean operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds) { + + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型ID不能为空"); + } + + if(StringUtils.isEmpty(workIds)){ + this.invalidationParamsException("用工ID不能为空"); + } + + { + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(merId); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + SysSydVo sysSydVo = this.sysSydMapper.selectVoById(sydId); + Date d = new Date(); + Long userId = LoginHelper.getUserId(); + List list = this.baseMapper.selUserWorkByMerServInfo(merId,sydId,workIds,busType); + List li = new ArrayList(); + for (UserWorkerBusinessVo vo :list){ + UserWorkerBusiness bo = new UserWorkerBusiness(); + bo.setWorkId(vo.getWorkId()); + bo.setVPhone(vo.getvPhoneNoHide()); + bo.setSydId(sydId); + bo.setSydNo(sysSydVo.getNo()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setMerId(merId); + bo.setMerNo(busOperAndAgentAndMer.getMerNo()); + bo.setBusType(busType); + bo.setCreateTime(d); + bo.setSignStatus(0); + bo.setCreateBy(userId); + li.add(bo); + } + this.baseMapper.insertBatch(li); + return true; + } + } + + @Override + public Boolean operAddUserWorkAll(Long merId, Long sydId, Integer busType) { + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(merId); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + SysSydVo sysSydVo = this.sysSydMapper.selectVoById(sydId); + + Date d = new Date(); + Long userId = LoginHelper.getUserId(); + List list = this.baseMapper.selUserWorkByMerServInfo(merId,sydId,null,busType); + List li = new ArrayList(); + for (UserWorkerBusinessVo vo :list){ + UserWorkerBusiness bo = new UserWorkerBusiness(); + bo.setWorkId(vo.getWorkId()); + bo.setVPhone(vo.getvPhoneNoHide()); + bo.setSydId(sydId); + bo.setSydNo(sysSydVo.getNo()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setMerId(merId); + bo.setMerNo(busOperAndAgentAndMer.getMerNo()); + bo.setBusType(busType); + bo.setCreateTime(d); + bo.setSignStatus(0); + bo.setCreateBy(userId); + li.add(bo); + } + this.baseMapper.insertBatch(li); + return true; + } + + private void isSign(List list,Long sydId,Integer busType){ + + + Map paraMap = new HashMap(); + paraMap.put("workIds",list); + paraMap.put("sydId",sydId); + paraMap.put("busType",busType); + + List signList = this.baseMapper.selUserWorkBizByWorkIdSydIdBusType(paraMap); + if(signList != null && !signList.isEmpty()){ + Map resultMap = signList.stream().collect(Collectors.toMap(UserWorkerBusinessVo::getWorkId, userWorkerBusinessVo -> userWorkerBusinessVo)); + for(UserWorkerBusiness vo : list){ + UserWorkerBusinessVo uwbvo = resultMap.get(vo.getWorkId()); + if(uwbvo != null){ + vo.setSignStatus(1); + vo.setNo(uwbvo.getNo()); + vo.setSignFileUrl(uwbvo.getSignFileUrl()); + } + } + } + } + + /*** + * + * 用工银行账号处理 + * @param bo + * + */ + private void dwUserWorkBank(UserWokerOperBo bo) { + + String chnnalName = this.baseMapper.selSydDefaultChannel(bo.getSydId()); + if(StringUtils.isEmpty(chnnalName)){ + List dictDataList = this.remoteDictService.selectDictDataByType("pay_channel"); + if(dictDataList != null && !dictDataList.isEmpty()){ + chnnalName = dictDataList.get(0).getDictLabel(); + } + } + + if(StringUtils.isNotEmpty(chnnalName)){ + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWork_id()); + bno.setChannelName(chnnalName); + bno.setBackCard(bo.getBackCard()); + List accountVo = this.userWorkerAccountMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo selVo = null; + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + } + if(vo.getBankCard().equals(bo.getBackCard())){ + cz = true; + selVo = vo; + } + } + } + if(cz && StringUtils.isNotEmpty(bo.getBankPic())){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setBankCardPic(bo.getBankPic()); + this.userWorkerAccountMapper.updateById(uwab); + }else if(!cz){ + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBackCard()); + bankAcc.setBankType(bo.getKhh()); + bankAcc.setUnitId(0L); + bankAcc.setName(bo.getWorkName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWork_id()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBackCard()); + uwab.setPassage(chnnalName); + uwab.setBankCardPic(bo.getBankPic()); + uwab.setBankType(bo.getKhh()); + uwab.setCreateTime(new Date()); + uwab.setCreateBy(LoginHelper.getUserId()); + if(!isDefault){ + uwab.setIsDefault(1L); + }else{ + uwab.setIsDefault(0L); + } + this.userWorkerAccountMapper.insert(uwab); + } + } + + } + + + /**** + * 运营商 - 信息修改 + * @param uwb + * @return + */ + @Override + @Transactional + public Boolean updateUserWorkInfo(UserWorkerBo uwb){ + + if(uwb.getId() == null){ + this.invalidationParamsException("用户ID不能为空"); + } + if(uwb.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + this.baseMapper.updateUserWorkByCardId(uwb); + UserWorkerBusinessBo uwbb = new UserWorkerBusinessBo(); + uwbb.setWorkId(uwb.getId()); + uwbb.setMerId(uwb.getMerId()); + uwbb.setVPhone(uwb.getPhone()); + this.baseMapper.updateUserWorkBisByWorkId(uwbb); + return true; + } + + + + @Override + public UserWorkerNoHideVo selMemberInfoNySignId(UserWorkerBusinessBo bo ){ + if(bo.getId() == null){ + this.invalidationParamsException("签约ID不能为空"); + } + UserWorkerVo vo = this.baseMapper.selMemberInfo(bo); + UserWorkerNoHideVo noHideVo = BeanUtil.copyProperties(vo, UserWorkerNoHideVo.class); + noHideVo.setCardIdNoHide(vo.getCardIdNoHide()); + noHideVo.setPhoneNoHide(vo.getPhoneNoHide()); + return noHideVo; + } + + + /*** + * 单个导出用工的身份证信息 + * @param workId + * @param response + */ + @Override + public void exportCardImg(Long workId, HttpServletResponse response)throws Exception { + + if(workId == null){ + this.invalidationParamsException("用工ID不能为空"); + } + + UserWorker uw = this.userWorkerMapper.selectById(workId); + + if(uw == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isEmpty(uw.getCardPositive()) && StringUtils.isEmpty(uw.getCardBack())){ + this.invalidationParamsException("此会员未上传身份证图片"); + } + + RemoteUserWorkerZipVo vo = new RemoteUserWorkerZipVo(); + vo.setWorkName(uw.getName()); + vo.setWorkId(uw.getId()); + vo.setCardPositive(uw.getCardPositive()); + vo.setCardBack(uw.getCardBack()); + byte[] imgByte = this.remoteUserWokerService.downLoadSigleSfzZip(vo);response.reset(); + //response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); +// response.setHeader("Content-Disposition", "attachment; filename=\""+uw.getName()+"身份证信息.zip\""); + response.addHeader("Content-Length", "" + imgByte.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + FileUtils.setAttachmentResponseHeader(response,uw.getName()+"身份证信息.zip"); + IoUtil.write(response.getOutputStream(), false, imgByte); + + } + + + /*** + * 批量导出用工者身份证信息 + * @param workIds + */ + @Override + public void exportMutiCardImg(String workIds) throws Exception{ + + if(StringUtils.isEmpty(workIds)){ + this.invalidationParamsException("请输入用工者ID"); + } + + Long userId = LoginHelper.getUserId(); + String[] wids = workIds.split(","); + List list = new ArrayList(); + for(String s : wids){ + list.add(Long.valueOf(s)); + } + try{ + this.asyncTaxRecordsService.createSfzZipByUserInfos(list,userId,1); + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + +} + + + + +/*** + * 解析Excel监听器 + */ +class ExcelListener extends AnalysisEventListener { + + private List list = new ArrayList<>(); + + private Map idCardMap = new HashMap<>(); + + private Map phoneMap = new HashMap<>(); + @Override + public void invoke(UploadExcelItem importResultVo, AnalysisContext analysisContext) { + + + int rowIndex = analysisContext.readRowHolder().getRowIndex()+1; + + if(rowIndex > 503){ + throw new BaseException("导入上限为500条"); + + } + + if(StringUtils.isEmpty(importResultVo.getName())){ + throw new BaseException("第"+rowIndex+"行姓名不能为空"); + } + + if(StringUtils.isEmpty(importResultVo.getIdCard())){ + throw new BaseException("第"+rowIndex+"行身份证不能为空"); + } + + if(StringUtils.isEmpty(importResultVo.getPhone())){ + throw new BaseException("第"+rowIndex+"行手机号不能为空"); + } + + importResultVo.setIdCard(importResultVo.getIdCard().trim()); + Object obj = idCardMap.get(importResultVo.getIdCard()); + if(obj == null){ + idCardMap.put(importResultVo.getIdCard(), ""); + }else{ + throw new BaseException("第"+rowIndex+"行身份证["+importResultVo.getIdCard()+"]已存在"); + } + importResultVo.setPhone(importResultVo.getPhone().trim()); + Object phoneObj = phoneMap.get(importResultVo.getPhone()); + if(phoneObj == null){ + phoneMap.put(importResultVo.getPhone(), ""); + }else{ + throw new BaseException("第"+rowIndex+"行手机号["+importResultVo.getPhone()+"]已存在"); + } + this.list.add(importResultVo); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + + + public List getList() { + return this.list; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java new file mode 100644 index 0000000..f17de6e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java @@ -0,0 +1,140 @@ +package org.dromara.payment.worker.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IUserWorkerService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者Service业务层处理 + * + * @author LionLi + * @date 2024-04-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerServiceImpl implements IUserWorkerService { + + private final UserWorkerMapper baseMapper; + + /** + * 查询自雇者 + */ + @Override + public UserWorkerVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者列表 + */ + @Override + public List queryList(UserWorkerBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), "open_id", bo.getOpenId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(bo.getIsAuthentication() != null, "is_authentication", bo.getIsAuthentication()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getCardPositive()), "card_positive", bo.getCardPositive()); + lqw.eq(StringUtils.isNotBlank(bo.getCardBack()), "card_back", bo.getCardBack()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getIsAuth() != null, "is_auth", bo.getIsAuth()); + lqw.eq(bo.getIsSign() != null, "is_sign", bo.getIsSign()); + lqw.eq(bo.getSignTime() != null, "sign_time", bo.getSignTime()); + lqw.eq(bo.getIsRegister() != null, "is_register", bo.getIsRegister()); + lqw.eq(StringUtils.isNotBlank(bo.getPhotoPath()), "photo_path", bo.getPhotoPath()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), "sex", bo.getSex()); + lqw.eq(StringUtils.isNotBlank(bo.getTag()), "tag", bo.getTag()); + lqw.eq(StringUtils.isNotBlank(bo.getUserArea()), "user_area", bo.getUserArea()); + lqw.like(StringUtils.isNotBlank(bo.getUserAreaName()), "user_area_name", bo.getUserAreaName()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), "editer", bo.getEditer()); + lqw.eq(bo.getEditTime() != null, "edit_time", bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getNation()), "nation", bo.getNation()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), "address", bo.getAddress()); + lqw.eq(bo.getBirthday() != null, "birthday", bo.getBirthday()); + lqw.eq(StringUtils.isNotBlank(bo.getIssue()), "issue", bo.getIssue()); + lqw.eq(bo.getIssueDate() != null, "issueDate", bo.getIssueDate()); + lqw.eq(StringUtils.isNotBlank(bo.getExpiryDate()), "expiryDate", bo.getExpiryDate()); + lqw.eq(StringUtils.isNotBlank(bo.getReferrerBy()), "referrer_by", bo.getReferrerBy()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), "alipay_logon_id", bo.getAlipayLogonId()); + lqw.eq(bo.getStatus() != null, "status", bo.getStatus()); + return lqw; + } + + /** + * 新增自雇者 + */ + @Override + public Boolean insertByBo(UserWorkerBo bo) { + UserWorker add = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者 + */ + @Override + public Boolean updateByBo(UserWorkerBo bo) { + UserWorker update = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorker entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml b/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml new file mode 100644 index 0000000..8ea15bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9205 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-payment + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml new file mode 100644 index 0000000..99b0646 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml @@ -0,0 +1,87 @@ + + + + + + id, bus_type, bus_item, buis_id, tran_id, add_time, tran_result, tran_batch, tran_time, + source_acc_id, target_acc_id, bus_batch, source_acc_type, tran_no + + + + + + + + + UPDATE ( SELECT id FROM tran_log WHERE tran_batch IS NULL AND tran_result = ${result} + + AND is_callback = ${isCallback} + + + AND id > ${minId} + + ORDER BY add_time ASC LIMIT ${start}, ${size} ) t + INNER JOIN tran_log t1 ON t1.id = t.id + SET t1.tran_batch = '${synBatch}' + + + + update tran_log + set tran_batch = NULL + where id = #{id,jdbcType=BIGINT} + + + + update tran_log + set tran_batch = NULL + where tran_batch = '${synBatch}' + AND tran_result = ${result} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml new file mode 100644 index 0000000..e08e8eb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml @@ -0,0 +1,115 @@ + + + + + SELECT + t.`id`, + t.`cno`, + t.`bus_no`, + t.`bill_no`, + t.`bill_id`, + t.`worker_id`, + t.`worker_name`, + t.`worker_phone`, + t.`worker_enroll_id`, + t.`card_id`, + t.`bank_type`, + t.`bank_card`, + t.`bank_cheque`, + t.`money`, + t.`raise`, + t.`amount`, + t.`pay_status`, + t.`pay_time`, + t.`pay_remark`, + t.`pay_receipt`, + t.`service_charge_money`, + t.`add_time`, + t.`bank_no`, + t.`agent_money`, + t.`is_refund`, + t.`refund_time`, + t.`out_no`, + t.`is_out`, + t.`passage`, + t.`task_id`, + t.`task_no`, + t.`syd_id`, + t.`syd_no`, + t.`op_no`, + t.`op_id`, + t.`channel_id`, + t.`channel_no`, + t.`channel_code`, + t.`mer_id`, + t.`mer_no`, + t.`bus_type`, + t.`pay_receipt_b2b`, + t.`pro_no`, + t.`charge_mode`, + t.`op_service_charge_rate`, + t.`op_service_charge_money`, + t.`op_halve_status`, + t.`op_halve_remark`, + t.`fhzx_service_charge_rate`, + t.`fhzx_service_charge_money`, + t.`fhzx_channel_id`, + t.`zj_service_charge_rate`, + t.`zj_service_charge_money`, + t.`zj_channel_id`, + t.`ywy_service_charge_rate`, + t.`ywy_service_charge_money`, + t.`ywy_channel_id`, + t.`channel_halve_status`, + t.`bill_remark`, + t.`syd_service_charge_rate`, + t.`syd_service_charge_money`, + t.`syd_halve_status`, + t.`syd_halve_remark`, + t.`pt_service_charge_money`, + t.`pt_halve_status`, + t.`pt_halve_remark`, + t2.gsmc syd_name, + t1.`name` mer_name, + t3.`name` op_name, + t4.`name` fhzx_channel_name, + t5.`name` zj_channel_name, + t6.`name` ywy_channel_name, + t.sh_service_charge_rate + + + + FROM + mer_bill_detail t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + INNER JOIN bus_operator t3 ON t3.id = t.op_id + LEFT JOIN bus_channel t4 ON t4.id = t.fhzx_channel_id + LEFT JOIN bus_channel t5 ON t5.id = t.zj_channel_id + LEFT JOIN bus_channel t6 ON t6.id = t.ywy_channel_id + ${ew.getCustomSqlSegment} + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml new file mode 100644 index 0000000..6e0efd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml @@ -0,0 +1,84 @@ + + + + + SELECT + t.`id`, + t.`task_id`, + t.`task_no`, + t.`no`, + t.`service_charge_type`, + t.`service_charge_rate`, + t.`money`, + t.`service_charge_amount`, + t.`amount_ent`, + t.`status`, + t.`pay_status`, + t.`pay_time`, + t.`give_up_time`, + t.`give_up_by`, + t.`add_time`, + t.`add_by`, + t.`verify_status`, + t.`verify_by`, + t.`verify_time`, + t.`verify_reason`, + t.`passage`, + t.`detailCount`, + t.`is_agency_fee`, + t.`wssph`, + t.`wtdzgssph`, + t.`sph_time`, + t.`sph_by`, + t.`out_no`, + t.`is_out`, + t.`syd_id`, + t.`syd_no`, + t2.gsmc syd_name, + t.`op_no`, + t.`op_id`, + t.`channel_id`, + t.`channel_no`, + t.`channel_code`, + t.`mer_id`, + t.`mer_no`, + t1.`name` mer_name, + t.`pro_no`, + t.`pro_id`, + t.`syd_verify_status`, + t.`syd_verify_by`, + t.`syd_verify_time`, + t.`syd_verify_reason`, + t.`is_invoice`, + t.`bus_type`, + t.`settlement_style`, + t.`max_month`, + t.`invoice_type`, + t.`charge_mode`, + t3.name taskName + + + + FROM + mer_bill t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + INNER JOIN mer_task t3 on t.task_id = t3.id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml new file mode 100644 index 0000000..156240b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml @@ -0,0 +1,126 @@ + + + + + SELECT + t.id, + t.channel_id, + t.syd_id, + t.acc_id, + t.bank_type, + + t.balance, + t.frozen, + t.cashout, + t.is_default, + + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` channel_name, + t1.`name` acc_name, + t1.no channel_no, + t1.khd, + max(t1.bank_card) bank_card, + SUM(t2.money) yesterday + + + + FROM + bus_channel_account t + INNER JOIN bus_channel t1 ON t1.id = t.channel_id + LEFT JOIN bus_channel_flows t2 on t2.channel_id = t1.id + AND t2.bus_type = 12 + AND t2.add_time BETWEEN #{ew.entity.flowsBeginTime} and #{ew.entity.flowsEndTime} + ${ew.getCustomSqlSegment} + GROUP BY t.id, + t.channel_id, + t.syd_id, + t.acc_id, + t.bank_type, + t.bank_card, + t.balance, + t.frozen, + t.cashout, + t.is_default, + t.yesterday, + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time + + + + + + + + UPDATE bus_channel_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + + UPDATE bus_channel_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE bus_channel_account + SET cashout = cashout + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + + + UPDATE bus_channel_account + SET yesterday = yesterday + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml new file mode 100644 index 0000000..892d90d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml new file mode 100644 index 0000000..4a371d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml @@ -0,0 +1,60 @@ + + + + + SELECT + t.id, + t.syd_id, + t.channel_id, + t.acc_id, + t.bus_no, + t.amount, + t.remark, + t.khh, + t.khh_no, + t.fr, + t.khd, + t.bank_card, + t.verify_status, + t.verify_time, + t.verify_by, + t.verify_reason, + t.invoice_pic, + t.pay_status, + t.pay_time, + t.pay_remark, + t.add_time, + t.add_by, + t.passage, + t.pay_receipt, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` channel_name, + t1.no channel_no + + + + FROM + bus_channel_cashout t + INNER JOIN bus_channel t1 ON t1.id = t.channel_id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml new file mode 100644 index 0000000..cb32fa4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml @@ -0,0 +1,162 @@ + + + + + + insert into bus_channel_flows + + + id, + + + channel_id, + + + bus_type, + + + bus_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_type, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + + + #{id,jdbcType=INTEGER}, + + + #{channelId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from bus_channel_account t where t.channel_id = ${payerId}), + + + ((select t.balance from bus_channel_account t where t.channel_id = ${payeeId}) + ${money}), + + + ((select t.balance from bus_channel_account t where t.channel_id = ${payerId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml new file mode 100644 index 0000000..7b44b71 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml new file mode 100644 index 0000000..1f89180 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update bus_channel_product set cost_service_charge = #{costServiceCharge} where channel_id in (select id from bus_channel t1 where t1.p_id = #{channelId}) + and channel_no = #{channelNo} + and bus_type = #{busType} + and pro_no = #{proNo} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml new file mode 100644 index 0000000..0e54c5b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml new file mode 100644 index 0000000..4050332 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml @@ -0,0 +1,233 @@ + + + + + SELECT + t.id, + t.syd_id, + t.unit_id, + t.acc_id, + t.bank_type, + t.bank_card, + t.balance, + t.frozen, + t.is_default, + t.add_time, + t.STATUS, + t.add_ype, + t.out_bank_card, + t.remark, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` unit_name, + t1.no unit_no, + t1.unit_type, + t1.cust_no, + t2.gsmc syd_name + + + + FROM + bus_accounts t + INNER JOIN sys_unit t1 ON t1.id = t.unit_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + insert into bus_accounts + + + id, + + + syd_id, + + + unit_id, + + + acc_id, + + + bank_type, + + + bank_card, + + + balance, + + + frozen, + + + is_default, + + + add_time, + + + status, + + + add_ype, + + + out_bank_card, + + + remark, + + + lhh, + + + khh, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{unitId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=SMALLINT}, + + + #{addYpe,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_accounts t + WHERE + t.syd_id = #{sydId} and t.unit_id = #{unitId} and t.bank_type = #{bankType}) + + + + UPDATE bus_accounts + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND unit_id = #{unitId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + AND bank_type is null + + + + + + UPDATE bus_accounts + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND unit_id = #{unitId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + AND balance >= frozen + ${amount} + + + + + + UPDATE bus_accounts + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_accounts + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml new file mode 100644 index 0000000..a08bb1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml new file mode 100644 index 0000000..0b23dc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml new file mode 100644 index 0000000..417fd23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml new file mode 100644 index 0000000..fdf129e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml @@ -0,0 +1,183 @@ + + + + + SELECT + t.id, + t.inv_id, + t.inv_amount, + t.STATUS, + t.money, + t.service_charge_amount, + t.task_id, + t.task_no, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bill_id, + t.bill_no, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t2.gsmc syd_name, + t1.`name` mer_name + + + + FROM + mer_invoice_bill t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + + + + + + UPDATE mer_invoice_bill t + INNER JOIN mer_bill t1 ON t1.id = t.bill_id + AND t1.is_invoice = #{sourceStatus} + AND t.`status` = 1 + AND t.inv_id = #{invId} + SET t1.is_invoice = #{targetStatus} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml new file mode 100644 index 0000000..70575ab --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml new file mode 100644 index 0000000..ed055b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml @@ -0,0 +1,196 @@ + + + + + SELECT + t.id, + t.no, + t.header, + t.type, + t.credit_code, + t.bank_address, + t.bank_card, + t.category, + t.inv_num, + t.inv_amount, + t.add_id, + t.add_name, + t.add_phone, + t.add_address, + t.add_email, + t.iogistics_status, + t.iogistics_time, + t.iogistics_by, + t.iogistics_company, + t.iogistics_no, + t.status, + t.add_time, + t.add_by, + t.cancel_time, + t.cancel_by, + t.cancel_reason, + t.inv_remark, + t.remark, + t.dwzcdz, + t.dwdh, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bus_type, + t.iogistics_receiving_time, + t.iogistics_receiving_by, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t2.gsmc syd_name, + t1.`name` mer_name, + t.update_time, + GROUP_CONCAT(t3.bill_no SEPARATOR ',') billNos + + + + FROM + mer_invoice t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + LEFT JOIN mer_invoice_bill t3 ON t3.inv_id = t.id + AND t3.status = 1 + ${ew.getCustomSqlSegment} + GROUP BY + t.id, + t.no, + t.header, + t.type, + t.credit_code, + t.bank_address, + t.bank_card, + t.category, + t.inv_num, + t.inv_amount, + t.add_id, + t.add_name, + t.add_phone, + t.add_address, + t.add_email, + t.iogistics_status, + t.iogistics_time, + t.iogistics_by, + t.iogistics_company, + t.iogistics_no, + t.status, + t.add_time, + t.add_by, + t.cancel_time, + t.cancel_by, + t.cancel_reason, + t.inv_remark, + t.remark, + t.dwzcdz, + t.dwdh, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bus_type, + t.iogistics_receiving_time, + t.iogistics_receiving_by, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t2.gsmc, + t1.`name`, + t.update_time + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml new file mode 100644 index 0000000..36f335e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml new file mode 100644 index 0000000..b8096fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml @@ -0,0 +1,419 @@ + + + + + `id`, + `mer_id`, + `syd_id`, + `acc_id`, + `bank_type`, + `bank_virtual_card`, + `balance`, + `frozen`, + `is_default`, + `add_time`, + `settlement`, + `invoice_settlement`, + `invoice`, + `status`, + `out_bank_card`, + name, + lhh, + khh + + + + insert into bus_merchant_account + + + id, + + + mer_id, + + + syd_id, + + + acc_id, + + + bank_type, + + + bank_virtual_card, + + + balance, + + + frozen, + + + is_default, + + + add_time, + + + settlement, + + + invoice_settlement, + + + invoice, + + + status, + + + out_bank_card, + + + name, + + + lhh, + + + khh, + + + + + #{id,jdbcType=INTEGER}, + + + #{merId,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankVirtualCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{settlement,jdbcType=BIGINT}, + + + #{invoiceSettlement,jdbcType=BIGINT}, + + + #{invoice,jdbcType=BIGINT}, + + + #{status,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_merchant_account t + WHERE + t.syd_id = #{sydId} and t.mer_id = #{merId} and t.bank_type = #{bankType}) + + + + + + + + + + update bus_merchant_account + + + mer_id = #{merId,jdbcType=BIGINT}, + + + syd_id = #{sydId,jdbcType=INTEGER}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_virtual_card = #{bankVirtualCard,jdbcType=VARCHAR}, + + + balance = #{balance,jdbcType=BIGINT}, + + + frozen = #{frozen,jdbcType=BIGINT}, + + + is_default = #{isDefault,jdbcType=TINYINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=SMALLINT}, + + + where acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET `status` = 2 + WHERE + `status` = 1 + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + + UPDATE bus_merchant_account + SET `status` = 1 + WHERE + `status` = 2 + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + + UPDATE bus_merchant_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET invoice_settlement = invoice_settlement + #{invoice,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + AND balance >= frozen + ${amount} + + + + + + UPDATE bus_merchant_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET invoice_settlement = invoice_settlement + #{invoice,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml new file mode 100644 index 0000000..124f8be --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + id, sort, syn_lock, syn_batch, syn_position + + + + + + INSERT INTO bus_merchant_account_syn ( id ) SELECT + t.acc_id + FROM + bus_merchant_account t + WHERE + NOT EXISTS ( + SELECT + t1.id + FROM + bus_merchant_account_syn t1 + WHERE + t1.id = t.acc_id) + + + + UPDATE ( SELECT id FROM bus_merchant_account_syn + WHERE syn_lock = 0 AND syn_batch IS NULL + + AND id > ${minId} + + ORDER BY sort DESC,id ASC LIMIT ${start}, ${size} ) t + INNER JOIN bus_merchant_account_syn t1 ON t1.id = t.id + SET t1.syn_batch = '${synBatch}' + + + + update bus_merchant_account_syn + set syn_lock = 0, + syn_batch = NULL + where id = #{id,jdbcType=INTEGER} + + + + update bus_merchant_account_syn + set syn_lock = 0, + syn_batch = NULL + where syn_batch = '${synBatch}' + + + + UPDATE bus_merchant_account_syn + SET syn_lock = 1 + WHERE + syn_lock = 0 + AND syn_batch = '${synBatch}' + AND id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml new file mode 100644 index 0000000..2eaed0d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml new file mode 100644 index 0000000..b1aa175 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml new file mode 100644 index 0000000..f8bde8f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml new file mode 100644 index 0000000..f91575f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml @@ -0,0 +1,38 @@ + + + + + insert into bus_merchant_flows (mer_id, syd_id, + bus_type, channel, bus_no, + bank_no, money, balance, + add_time, add_by, bus_desc, + bill_no, bill_id, bill_detail_id, + tran_no, tran_type, tran_status, + payer_type, payer_id, payer_name, + payer_acc, payer_acc_id, payee_type, + payee_id, payee_name, payee_acc, + payee_acc_id, remark, pay_receipt, + pay_receipt_type, illustrate) + + select #{item.merId,jdbcType=INTEGER}, #{item.sydId,jdbcType=INTEGER}, + #{item.busType,jdbcType=SMALLINT}, #{item.channel,jdbcType=VARCHAR}, #{item.busNo,jdbcType=VARCHAR}, + #{item.bankNo,jdbcType=VARCHAR}, #{item.money,jdbcType=BIGINT}, + + ((select t.balance from bus_merchant_account t where t.acc_id = ${item.payeeAccId}) + ${item.preMoney} + ${item.money}), + + + ((select t.balance from bus_merchant_account t where t.acc_id = ${item.payerAccId}) + ${item.preMoney} + ${item.money}), + + #{item.addTime,jdbcType=TIMESTAMP}, #{item.addBy,jdbcType=VARCHAR}, #{item.busDesc,jdbcType=VARCHAR}, + #{item.billNo,jdbcType=VARCHAR}, #{item.billId,jdbcType=INTEGER}, #{item.billDetailId,jdbcType=INTEGER}, + #{item.tranNo,jdbcType=VARCHAR}, #{item.tranType,jdbcType=SMALLINT}, #{item.tranStatus,jdbcType=SMALLINT}, + #{item.payerType,jdbcType=SMALLINT}, #{item.payerId,jdbcType=INTEGER}, #{item.payerName,jdbcType=VARCHAR}, + #{item.payerAcc,jdbcType=VARCHAR}, #{item.payerAccId,jdbcType=INTEGER}, #{item.payeeType,jdbcType=SMALLINT}, + #{item.payeeId,jdbcType=INTEGER}, #{item.payeeName,jdbcType=VARCHAR}, #{item.payeeAcc,jdbcType=VARCHAR}, + #{item.payeeAccId,jdbcType=INTEGER}, #{item.remark,jdbcType=VARCHAR}, #{item.payReceipt,jdbcType=VARCHAR}, + #{item.payReceiptType,jdbcType=SMALLINT}, #{item.illustrate,jdbcType=VARCHAR} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml new file mode 100644 index 0000000..65c8657 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml @@ -0,0 +1,73 @@ + + + + + + update bus_merchant + set + ywy_id = #{ywyId}, + salesman_id = #{ywyId}, + update_by = #{updateBy}, + update_time = #{updateTime} + where id = #{id} + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml new file mode 100644 index 0000000..d065a35 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + update bus_merchant_product set update_by = #{updateBy}, update_time = #{updateTime} + ,cost_service_charge = #{costServiceCharge} + ,service_charge = #{serviceCharge} + ,mdy_service_charge = #{mdyServiceCharge} + + and channel_no = #{channelNo} + and bus_type = #{busType} + and pro_no = #{proNo} + + + + + + + + update bus_merchant_product set service_charge = mdy_service_charge where service_charge != mdy_service_charge and mdy_service_charge is not null + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml new file mode 100644 index 0000000..49b998f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml new file mode 100644 index 0000000..0e94638 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml new file mode 100644 index 0000000..1287f64 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml new file mode 100644 index 0000000..64824d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml new file mode 100644 index 0000000..f5c1479 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml @@ -0,0 +1,252 @@ + + + + + SELECT + t.id, + t.op_id, + t.syd_id, + t.acc_id, + t.bank_type, + t.bank_virtual_card, + t.balance, + t.frozen, + t.cashout, + t.cashouting, + t.is_default, + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.gsmc syd_name, + t1.gsmc acc_name, + t1.no syd_no + + + + FROM + bus_operator_account t + INNER JOIN sys_syd t1 ON t1.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + insert into bus_operator_account + + + id, + + + op_id, + + + syd_id, + + + acc_id, + + + bank_type, + + + bank_virtual_card, + + + balance, + + + frozen, + + + cashout, + + + cashouting, + + + is_default, + + + add_time, + + + status, + + + out_bank_card, + + + name, + + + khh, + + + lhh, + + + + + #{id,jdbcType=INTEGER}, + + + #{opId,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankVirtualCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{cashout,jdbcType=BIGINT}, + + + #{cashouting,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_operator_account t + WHERE + t.syd_id = #{sydId} and t.op_id = #{opId} and t.is_default = 0 and t.bank_type = #{bankType}) + + + + UPDATE bus_operator_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_operator_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE bus_operator_account + SET cashout = cashout + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_operator_account + SET cashouting = cashouting + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + + + + + + + UPDATE bus_operator_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml new file mode 100644 index 0000000..eb4e265 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml new file mode 100644 index 0000000..d6ca269 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml @@ -0,0 +1,65 @@ + + + + + SELECT + t.id, + t.syd_id, + t.op_id, + t.acc_id, + t.bus_no, + t.amount, + t.remark, + t.khh, + t.khh_no, + t.fr, + t.khd, + t.bank_card, + t.verify_status, + t.verify_time, + t.verify_by, + t.verify_reason, + t.iogistics_company, + t.iogistics_no, + t.invoice_pic, + t.pay_status, + t.pay_time, + t.pay_remark, + t.add_time, + t.add_by, + t.passage, + t.pay_receipt, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` op_name, + t1.no op_no, + t2.gsmc syd_name, + t2.no syd_no + + + + FROM + bus_operator_cashout t + INNER JOIN bus_operator t1 ON t1.id = t.op_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml new file mode 100644 index 0000000..2f7de29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml @@ -0,0 +1,198 @@ + + + + + + insert into bus_operator_flows + + + id, + + + op_id, + + + bus_type, + + + channel, + + + bus_no, + + + bank_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_no, + + + tran_type, + + + tran_status, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + pay_receipt, + + + pay_receipt_type, + + + + + #{id,jdbcType=INTEGER}, + + + #{opId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{channel,jdbcType=VARCHAR}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from bus_operator_account t where t.acc_id = ${payerAccId}), + + + ((select t.balance from bus_operator_account t where t.acc_id = ${payeeAccId}) + ${money}), + + + ((select t.balance from bus_operator_account t where t.acc_id = ${payerAccId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranNo,jdbcType=VARCHAR}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{tranStatus,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + #{payReceipt,jdbcType=VARCHAR}, + + + #{payReceiptType,jdbcType=SMALLINT}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml new file mode 100644 index 0000000..2c7fe1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml new file mode 100644 index 0000000..49baccf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml @@ -0,0 +1,121 @@ + + + + + + INSERT INTO `bus_operator_product` ( + `syd_id`, + `syd_no`, + `bus_type`, + `pro_no`, + `pro_id`, + `op_no`, + `op_id`, + `cost_service_charge`, + `service_charge`, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + `create_time`, + `create_by`, + `update_time`, + `update_by` + ) + + SELECT + `syd_id`, + `syd_no`, + `bus_type`, + `no`, + `id`, + #{item.opNo}, + #{item.opId}, + `service_charge`, + #{item.serviceCharge}, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + #{createTime}, + #{createBy}, + #{createTime}, + #{createBy} + FROM + sys_syd_product + WHERE + id = #{item.proId} + + + + + INSERT INTO `bus_operator_product` ( + `syd_id`, + `syd_no`, + `bus_type`, + `pro_no`, + `pro_id`, + `op_no`, + `op_id`, + `cost_service_charge`, + `service_charge`, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + `pro_status`, + `create_time`, + `create_by` + ) values + + (#{item.sydId},#{item.sydNo},#{item.busType},#{item.proNo},#{item.proId},#{item.opNo},#{item.opId},#{item.costServiceCharge},#{item.serviceCharge},#{item.chargeMode}, + #{item.settlementStyle},#{item.maxMonth},#{item.invoiceType},#{item.invoiceItems},#{item.proStatus},#{item.createTime},#{item.createBy}) + + + + + + + + + + update bus_channel_product set cost_service_charge = #{item.cost_service_charge} where op_id =#{item.op_id} and pro_id= #{item.pro_id} and up_is_op = 1 + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml new file mode 100644 index 0000000..5b5efc2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml @@ -0,0 +1,32 @@ + + + + + + INSERT INTO re_product_invoice ( pro_type, pro_no, pro_id, invoice_type_id, create_time, create_by, update_time, update_by, bus_id, bus_type ) SELECT + pro_type, + pro_no, + pro_id, + invoice_type_id, + #{operTime}, + #{operBy}, + #{operTime}, + #{operBy}, + #{newBusId}, + #{newBusType} + FROM + re_product_invoice + WHERE + bus_type = #{busType} + AND bus_id IN + + #{item} + + AND pro_id IN + + #{item} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml new file mode 100644 index 0000000..67f9f56 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + id, syd_id, bank_type, bank_card, bank_acc_name, is_use, use_obj, use_obj_id, use_obj_name, + add_time,bank_arg_no + + + + + + + + + update acc_accounts + + + syd_id = #{sydId,jdbcType=BIGINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + bank_acc_name = #{bankAccName,jdbcType=VARCHAR}, + + + is_use = #{isUse,jdbcType=BIT}, + + + use_obj = #{useObj,jdbcType=SMALLINT}, + + + use_obj_id = #{useObjId,jdbcType=BIGINT}, + + + use_obj_name = #{useObjName,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + where is_use = 0 and id = #{id,jdbcType=INTEGER} + + + + update acc_accounts + + + syd_id = #{sydId,jdbcType=BIGINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + bank_acc_name = #{bankAccName,jdbcType=VARCHAR}, + + + is_use = #{isUse,jdbcType=BIT}, + + + use_obj = #{useObj,jdbcType=SMALLINT}, + + + use_obj_id = #{useObjId,jdbcType=BIGINT}, + + + use_obj_name = #{useObjName,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + + insert into acc_accounts + + + id, + + + syd_id, + + + bank_type, + + + bank_card, + + + bank_acc_name, + + + is_use, + + + use_obj, + + + use_obj_id, + + + use_obj_name, + + + add_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=BIGINT}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{bankAccName,jdbcType=VARCHAR}, + + + #{isUse,jdbcType=BIT}, + + + #{useObj,jdbcType=SMALLINT}, + + + #{useObjId,jdbcType=BIGINT}, + + + #{useObjName,jdbcType=VARCHAR}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml new file mode 100644 index 0000000..71cd2c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml new file mode 100644 index 0000000..5ddeb25 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml new file mode 100644 index 0000000..112f9d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml @@ -0,0 +1,18 @@ + + + + + + + + + update bus_operator set pay_password = #{payPassword} + ,create_time = #{createTime} + ,create_by = #{createBy} + where id = #{id} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml new file mode 100644 index 0000000..f3546e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + select id, syd_id, acc_id, bank_type, bank_card, balance, frozen, is_default, add_time from sys_syd_account + + + + + + + + + + insert into sys_syd_account + + syd_id, + acc_id, + acc_type, + bank_type, + bank_card, + balance, + frozen, + is_default, + add_time, + lhh, + khh, + name, + + + #{sydId}, + #{accId}, + #{accType}, + #{bankType}, + #{bankCard}, + #{balance}, + #{frozen}, + #{isDefault}, + #{addTime}, + #{lhh}, + #{khh}, + #{name}, + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + sys_syd_account t + WHERE + t.syd_id = #{sydId} and t.acc_type = #{accType} and t.bank_type = #{bankType}) + + + + update sys_syd_account + + syd_id = #{sydId}, + acc_id = #{accId}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + balance = #{balance}, + frozen = #{frozen}, + is_default = #{isDefault}, + add_time = #{addTime}, + status = #{status,jdbcType=SMALLINT}, + + where id = #{id} + + + + update sys_syd_account + + syd_id = #{sydId}, + acc_id = #{accId}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + balance = #{balance}, + frozen = #{frozen}, + is_default = #{isDefault}, + add_time = #{addTime}, + status = #{status,jdbcType=SMALLINT}, + + where acc_id = #{accId,jdbcType=BIGINT} + + + + delete from sys_syd_account where id = #{id} + + + + delete from sys_syd_account where id in + + #{id} + + + + + UPDATE sys_syd_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET `status` = 2 + WHERE + `status` = 1 + AND is_default = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + + + + UPDATE sys_syd_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE sys_syd_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE sys_syd_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE sys_syd_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml new file mode 100644 index 0000000..510b920 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml new file mode 100644 index 0000000..3662bc4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml new file mode 100644 index 0000000..89c93d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml new file mode 100644 index 0000000..6e62b44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml @@ -0,0 +1,238 @@ + + + + + + insert into sys_syd_flows + + + id, + + + syd_id, + + + bus_type, + + + channel, + + + bus_no, + + + bank_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_no, + + + tran_type, + + + tran_status, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + pay_receipt, + + + pay_receipt_type, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{channel,jdbcType=VARCHAR}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from sys_syd_account t where t.acc_id = ${payerAccId}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${payeeAccId}) + ${money}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${payerAccId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranNo,jdbcType=VARCHAR}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{tranStatus,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + #{payReceipt,jdbcType=VARCHAR}, + + + #{payReceiptType,jdbcType=SMALLINT}, + + + + + + + insert into sys_syd_flows (syd_id, bus_type, + channel, bus_no, bank_no, + money, balance, add_time, + add_by, bus_desc, bill_no, + bill_id, bill_detail_id, tran_no, + tran_type, tran_status, payer_type, + payer_id, payer_name, payer_acc, + payer_acc_id, payee_type, payee_id, + payee_name, payee_acc, payee_acc_id, + remark, pay_receipt, pay_receipt_type, + create_dept, create_by, create_time, + update_by, update_time) + + select #{item.sydId,jdbcType=INTEGER}, #{item.busType,jdbcType=SMALLINT}, + #{item.channel,jdbcType=VARCHAR}, #{item.busNo,jdbcType=VARCHAR}, #{item.bankNo,jdbcType=VARCHAR}, + #{item.money,jdbcType=BIGINT}, + + (select t.balance from sys_syd_account t where t.acc_id = ${item.payerAccId}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${item.payeeAccId}) + ${item.money}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${item.payerAccId}) + ${item.money}), + + #{item.addTime,jdbcType=TIMESTAMP}, + #{item.addBy,jdbcType=VARCHAR}, #{item.busDesc,jdbcType=VARCHAR}, #{item.billNo,jdbcType=VARCHAR}, + #{item.billId,jdbcType=INTEGER}, #{item.billDetailId,jdbcType=INTEGER}, #{item.tranNo,jdbcType=VARCHAR}, + #{item.tranType,jdbcType=SMALLINT}, #{item.tranStatus,jdbcType=SMALLINT}, #{item.payerType,jdbcType=SMALLINT}, + #{item.payerId,jdbcType=INTEGER}, #{item.payerName,jdbcType=VARCHAR}, #{item.payerAcc,jdbcType=VARCHAR}, + #{item.payerAccId,jdbcType=INTEGER}, #{item.payeeType,jdbcType=SMALLINT}, #{item.payeeId,jdbcType=INTEGER}, + #{item.payeeName,jdbcType=VARCHAR}, #{item.payeeAcc,jdbcType=VARCHAR}, #{item.payeeAccId,jdbcType=INTEGER}, + #{item.remark,jdbcType=VARCHAR}, #{item.payReceipt,jdbcType=VARCHAR}, #{item.payReceiptType,jdbcType=SMALLINT}, + #{item.createDept,jdbcType=BIGINT}, #{item.createBy,jdbcType=BIGINT}, #{item.createTime,jdbcType=TIMESTAMP}, + #{item.updateBy,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml new file mode 100644 index 0000000..f8196aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml @@ -0,0 +1,82 @@ + + + + + INSERT INTO `sys_syd_log` ( + `syd_id`, + `no`, + `gsmc`, + `kfd`, + `kfh`, + `bank_type`, + `bank_card`, + `jbsl`, + `quote_num`, + `add_time`, + `add_by`, + `editer`, + `edit_time`, + `province_id`, + `province_name`, + `city_id`, + `city_name`, + `county_id`, + `county_name`, + `nsr_sbh`, + `fr`, + `fr_cardid`, + `fr_phone`, + `con_name`, + `con_phone`, + `con_cardid`, + `con_email`, + `address`, + `business`, + `abridge`, + `limit_amount`, + `sign_mode`, + `sign_valid_time`, + `log_time` + ) SELECT + `id`, + `no`, + `gsmc`, + `kfd`, + `kfh`, + `bank_type`, + `bank_card`, + `jbsl`, + `quote_num`, + `add_time`, + `add_by`, + `editer`, + `edit_time`, + `province_id`, + `province_name`, + `city_id`, + `city_name`, + `county_id`, + `county_name`, + `nsr_sbh`, + `fr`, + `fr_cardid`, + `fr_phone`, + `con_name`, + `con_phone`, + `con_cardid`, + `con_email`, + `address`, + `business`, + `abridge`, + 0, + 0, + 1, + #{curTime} + FROM + sys_syd + WHERE + id = #{sydId} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml new file mode 100644 index 0000000..59f9786 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, gsmc, abridge, kfd, kfh, bank_type, bank_card, jbsl, quote_num, add_time, add_by, editer, province_id, province_name, city_id, city_name, county_id, county_name, nsr_sbh, fr, fr_cardid, fr_phone, con_name, con_phone, con_cardid, con_email, address, business from sys_syd + + + + + + + + + + update sys_syd + + gsmc = #{gsmc}, + abridge = #{abridge}, + kfd = #{kfd}, + kfh = #{kfh}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + jbsl = #{jbsl}, + quote_num = #{quoteNum}, + add_time = #{addTime}, + add_by = #{addBy}, + editer = #{editer}, + edit_time = #{editTime}, + province_id = #{provinceId}, + province_name = #{provinceName}, + city_id = #{cityId}, + city_name = #{cityName}, + county_id = #{countyId}, + county_name = #{countyName}, + nsr_sbh = #{nsrSbh}, + fr = #{fr}, + fr_cardid = #{frCardid}, + fr_phone = #{frPhone}, + con_name = #{conName}, + con_phone = #{conPhone}, + con_cardid = #{conCardid}, + con_email = #{conEmail}, + address = #{address}, + business = #{business}, + limit_amount = #{limitAmount}, + sign_mode = #{signMode}, + sign_valid_time = #{signValidTime}, + + where id = #{id} + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml new file mode 100644 index 0000000..fc2c702 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml @@ -0,0 +1,74 @@ + + + + + SELECT + t.`id`, + t.`id` pro_id, + t.`syd_id`, + t.`syd_no`, + t.`bus_type`, + t.`no`, + t.`no` pro_no, + s.gsmc syd_name, + t.`service_charge`, + + op.service_charge setingServiceCharge, + op.pro_status, + + + t.pro_status, + t.seting_service_charge, + + t.`charge_mode`, + t.`settlement_style`, + t.`max_month`, + t.`invoice_type`, + t.`invoice_items`, + t.`create_time`, + t.`create_by`, + t.`update_time`, + t.`update_by` + + FROM + `sys_syd_product` t + INNER JOIN sys_syd s ON s.id = t.syd_id + + AND t.create_time between #{where.params.begin_time} and #{where.params.end_time} + + + AND t.bus_type = #{where.params.bus_type} + + + AND t.no = #{where.params.no} + + + AND t.invoice_type = #{where.params.invoice_type} + + + AND s.gsmc like CONCAT(#{where.params.syd_name},'%') + + + AND s.no = #{where.params.syd_no} + + + LEFT JOIN bus_operator_product op ON op.pro_id = t.id + AND t.pro_status = 1 + AND op.op_id = #{where.params.opId} + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml new file mode 100644 index 0000000..fb2f24c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + id + + + content + + + + + insert into sys_syd_sign_content + + + id, + + + content, + + + editer, + + + edit_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{content,jdbcType=LONGVARCHAR}, + + + #{editer,jdbcType=VARCHAR}, + + + #{editTime,jdbcType=TIMESTAMP}, + + + + + update sys_syd_sign_content + + + content = #{content,jdbcType=LONGVARCHAR}, + + + editer = #{editer,jdbcType=VARCHAR}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=INTEGER} + + + update sys_syd_sign_content + set content = #{content,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml new file mode 100644 index 0000000..fda9ca4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml new file mode 100644 index 0000000..6fcc209 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml @@ -0,0 +1,73 @@ + + + + + + UPDATE mer_bill_detail t + INNER JOIN mer_task_enroll t1 ON t1.id = t.worker_enroll_id + AND t1.settlement_status = #{sourceSettlementStatus} + AND t.bill_id = #{billId} + SET t1.settlement_status = #{settlementStatus} + + + + + + UPDATE mer_task_enroll + SET verify_status = 3, + verify_by = #{verifyBy}, + verify_time = now() + WHERE task_id = #{taskId} + + and id in + + #{item} + + + + + + UPDATE mer_task_enroll + SET verify_status = 2, + verify_by = #{verifyBy}, + verify_time = now() + WHERE task_id = #{taskId} + + and id not in + + #{item} + + + + + + UPDATE mer_task_enroll + SET task_status = #{taskStatus}, + task_remark = #{taskRemark} + WHERE task_id = #{taskId} and id = #{id} and task_status in ( 1,2,3) + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml new file mode 100644 index 0000000..bac0097 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + update mer_task + set task_status = 8 + where id = #{id} + and limit_num = (select count(1) from mer_task_enroll + where task_id = #{id} and task_status = 3 and verify_status = 3) + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml new file mode 100644 index 0000000..3c9af50 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml new file mode 100644 index 0000000..f59bfda --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml new file mode 100644 index 0000000..19dcb30 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml new file mode 100644 index 0000000..3c0d4d8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml new file mode 100644 index 0000000..c3c63a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml new file mode 100644 index 0000000..83d0a63 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml new file mode 100644 index 0000000..516c093 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + delete from user_worker_bill where worker_id = #{workerId} and syd_id = #{sydId} and mer_id = #{merId} and bus_type = #{busType} and dtm_year = #{dtmYear} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml new file mode 100644 index 0000000..b167479 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + update user_worker + + + name = #{name}, + + + card_positive = #{cardPositive}, + + + card_back = #{cardBack}, + + + photo_path = #{photoPath}, + + + + + and card_id = #{cardId} + + + + and id = #{id} + + + + + + + + update user_worker_business + + + v_phone = #{vPhone} + + + + + and work_id = #{workId} + + + and mer_id = #{merId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml new file mode 100644 index 0000000..e7cdc20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml @@ -0,0 +1,50 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java b/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java new file mode 100644 index 0000000..7ae6b6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java @@ -0,0 +1,11629 @@ +package org.dromara.payment.invoice; + +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.mapper.MerInvoiceTypeMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title InvoiceImplTest + * @description + * @create 2024-07-11 16:54 + */ +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class InvoiceImplTest { + + + @Autowired + private MerInvoiceTypeMapper merInvoiceTypeMapper; + + + +// @Test +// public void testInsertDictData(){ +// +// { +// +// String json = "{\n" + +// " \"success\": true,\n" + +// " \"message\": \"操作成功!\",\n" + +// " \"code\": 200,\n" + +// " \"result\": [\n" + +// " {\n" + +// " \"id\": \"1321646609039216642\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"1\",\n" + +// " \"name\": \"劳务*垃圾处理处置劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609232154625\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"2\",\n" + +// " \"name\": \"劳务*污泥处理处置劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348930\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"3\",\n" + +// " \"name\": \"劳务*污水处理劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348931\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"4\",\n" + +// " \"name\": \"劳务*工业废气处理劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348932\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"5\",\n" + +// " \"name\": \"劳务*其他加工劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609244737537\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"6\",\n" + +// " \"name\": \"劳务*稀土金属及合金加工费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609244737538\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"7\",\n" + +// " \"name\": \"劳务*修理修配劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931842\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"8\",\n" + +// " \"name\": \"劳务*油气田生产性劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931843\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"9\",\n" + +// " \"name\": \"劳务*矿产资源开采劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931844\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"10\",\n" + +// " \"name\": \"劳务*矿产资源挖掘劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126145\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"11\",\n" + +// " \"name\": \"劳务*矿产资源切割劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126146\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"12\",\n" + +// " \"name\": \"劳务*矿产资源破碎劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126147\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"13\",\n" + +// " \"name\": \"劳务*矿产资源分拣劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126148\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"14\",\n" + +// " \"name\": \"劳务*矿产资源洗选劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609257320450\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"15\",\n" + +// " \"name\": \"交通运输服务*陆路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609257320451\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"16\",\n" + +// " \"name\": \"交通运输服务* 陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514754\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"17\",\n" + +// " \"name\": \"交通运输服务*水路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514755\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"18\",\n" + +// " \"name\": \"交通运输服务*水路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514756\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"19\",\n" + +// " \"name\": \"交通运输服务*水路运输期租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709058\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"20\",\n" + +// " \"name\": \"交通运输服务*水路运输程租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709059\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"21\",\n" + +// " \"name\": \"交通运输服务*航空客货运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709060\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"22\",\n" + +// " \"name\": \"交通运输服务* 航天运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709061\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"23\",\n" + +// " \"name\": \"交通运输服务* 液体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903361\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"24\",\n" + +// " \"name\": \"交通运输服务* 气体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903362\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"25\",\n" + +// " \"name\": \"交通运输服务* 固体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903363\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"26\",\n" + +// " \"name\": \"交通运输服务* 其他管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903364\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"27\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运陆路运输业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903365\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"28\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903366\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"29\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097666\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"30\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097667\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"31\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运联运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097668\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"32\",\n" + +// " \"name\": \"交通运输服务* 其他无运输工具承运业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097669\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"33\",\n" + +// " \"name\": \"交通运输服务* 旅客联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097670\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"34\",\n" + +// " \"name\": \"交通运输服务* 货物联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291969\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"35\",\n" + +// " \"name\": \"交通运输服务* 其他旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291970\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"36\",\n" + +// " \"name\": \"交通运输服务* 其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291971\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"37\",\n" + +// " \"name\": \"邮政服务*函件寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291972\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"38\",\n" + +// " \"name\": \"邮政服务*包裹寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291973\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"39\",\n" + +// " \"name\": \"邮政服务*其他邮件寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486274\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"40\",\n" + +// " \"name\": \"邮政服务*邮票发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486275\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"41\",\n" + +// " \"name\": \"邮政服务*报刊发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486276\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"42\",\n" + +// " \"name\": \"邮政服务*邮政汇兑\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486277\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"43\",\n" + +// " \"name\": \"邮政服务*其他邮政普遍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486278\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"44\",\n" + +// " \"name\": \"邮政服务*邮政特殊服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486279\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"45\",\n" + +// " \"name\": \"邮政服务*邮册等邮品销售服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486280\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"46\",\n" + +// " \"name\": \"邮政服务*邮政代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680578\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"47\",\n" + +// " \"name\": \"邮政服务*其他未列邮政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680579\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"48\",\n" + +// " \"name\": \"电信服务*语音通话服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680580\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"49\",\n" + +// " \"name\": \"电信服务*出租或出售网络元素\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680581\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"50\",\n" + +// " \"name\": \"电信服务*短信和彩信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680582\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"51\",\n" + +// " \"name\": \"电信服务*电子数据和信息的传输及应用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680583\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"52\",\n" + +// " \"name\": \"电信服务*互联网接入服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680584\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"53\",\n" + +// " \"name\": \"电信服务*广播电视信号传输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680585\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"54\",\n" + +// " \"name\": \"电信服务*卫星电视信号落地转接服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069185\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"55\",\n" + +// " \"name\": \"电信服务*其他增值电信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069186\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"56\",\n" + +// " \"name\": \"研发和技术服务*研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069187\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"57\",\n" + +// " \"name\": \"研发和技术服务*合同能源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069188\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"58\",\n" + +// " \"name\": \"研发和技术服务*工程勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069189\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"59\",\n" + +// " \"name\": \"研发和技术服务*地质勘查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069190\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:48:22\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"60\",\n" + +// " \"name\": \"*研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069191\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:34:40\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"61\",\n" + +// " \"name\": \"*信息技术服务*软件开发服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069192\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:58\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"62\",\n" + +// " \"name\": \"*信息技术服务*软件维护服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069193\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"63\",\n" + +// " \"name\": \"信息技术服务*软件测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069194\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:27\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"64\",\n" + +// " \"name\": \"*信息技术服务*其他软件服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263489\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"65\",\n" + +// " \"name\": \"信息技术服务*电路设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263490\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"66\",\n" + +// " \"name\": \"信息技术服务*电路测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263491\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"67\",\n" + +// " \"name\": \"信息技术服务*相关电路技术支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263492\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:05\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"68\",\n" + +// " \"name\": \"*信息技术服务*信息系统服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263493\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:36:10\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"69\",\n" + +// " \"name\": \"*信息技术服务*业务流程管理服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263494\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:27:57\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"70\",\n" + +// " \"name\": \"*信息技术服务*信息系统增值服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263495\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"71\",\n" + +// " \"name\": \"设计服务*工程设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263496\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"72\",\n" + +// " \"name\": \"设计服务*文印晒图服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263497\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"73\",\n" + +// " \"name\": \"设计服务*其他设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263498\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"74\",\n" + +// " \"name\": \"文化创意服务*知识产权服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263499\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"75\",\n" + +// " \"name\": \"广告服务*广告发布服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263500\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"76\",\n" + +// " \"name\": \"广告服务*广告代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263501\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"77\",\n" + +// " \"name\": \"会议展览服务*会议服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263502\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"78\",\n" + +// " \"name\": \"会议展览服务*展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263503\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"79\",\n" + +// " \"name\": \"航空地面服务*机场服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040706\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"80\",\n" + +// " \"name\": \"航空地面服务*空中交通管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040707\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"81\",\n" + +// " \"name\": \"航空地面服务*其他航空地面服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040708\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"82\",\n" + +// " \"name\": \"通用航空服务*航空摄影\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040709\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"83\",\n" + +// " \"name\": \"通用航空服务*航空培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235010\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"84\",\n" + +// " \"name\": \"通用航空服务*航空测量\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235011\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"85\",\n" + +// " \"name\": \"通用航空服务*航空勘探\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235012\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"86\",\n" + +// " \"name\": \"通用航空服务*航空护林\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235013\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"87\",\n" + +// " \"name\": \"通用航空服务*航空播洒农药\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235014\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"88\",\n" + +// " \"name\": \"通用航空服务*航空降雨\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235015\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"89\",\n" + +// " \"name\": \"通用航空服务*其他通用航空服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235016\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"90\",\n" + +// " \"name\": \"物流辅助服务*港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235017\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"91\",\n" + +// " \"name\": \"物流辅助服务*货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429313\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"92\",\n" + +// " \"name\": \"物流辅助服务*打捞救助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429314\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"93\",\n" + +// " \"name\": \"物流辅助服务*收派服务*收件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429315\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"94\",\n" + +// " \"name\": \"物流辅助服务*收派服务*分拣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429316\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"95\",\n" + +// " \"name\": \"物流辅助服务*收派服务*派送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429317\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"96\",\n" + +// " \"name\": \"鉴证咨询服务*认证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429318\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"97\",\n" + +// " \"name\": \"鉴证服务*工程监理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429319\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"98\",\n" + +// " \"name\": \"鉴证服务*涉税鉴证\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429320\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"99\",\n" + +// " \"name\": \"鉴证服务*纳税情况审查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429321\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"100\",\n" + +// " \"name\": \"鉴证服务*审计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429322\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"101\",\n" + +// " \"name\": \"鉴证服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429323\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"102\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429324\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"103\",\n" + +// " \"name\": \"咨询服务*专业税务顾问\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429325\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"104\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429326\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"105\",\n" + +// " \"name\": \"咨询服务*税收策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429327\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"106\",\n" + +// " \"name\": \"咨询服务*其他涉税服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429328\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"107\",\n" + +// " \"name\": \"咨询服务*会计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429329\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"108\",\n" + +// " \"name\": \"咨询服务*会计咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429330\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"109\",\n" + +// " \"name\": \"咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429331\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"110\",\n" + +// " \"name\": \"咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429332\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"111\",\n" + +// " \"name\": \"广播影视服务*广播节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429333\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"112\",\n" + +// " \"name\": \"广播影视服务*电视节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429334\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"113\",\n" + +// " \"name\": \"广播影视服务*电影制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429335\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"114\",\n" + +// " \"name\": \"广播影视服务*音像制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429336\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"115\",\n" + +// " \"name\": \"广播影视服务*广播节目发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429337\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"116\",\n" + +// " \"name\": \"广播影视服务*电视节目发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429338\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"117\",\n" + +// " \"name\": \"广播影视服务*广播节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429339\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"118\",\n" + +// " \"name\": \"广播影视服务*电影发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429340\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"119\",\n" + +// " \"name\": \"广播影视服务*广播节目播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429341\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"120\",\n" + +// " \"name\": \"广播影视服务*电视节目播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429342\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"121\",\n" + +// " \"name\": \"广播影视服务*现场电影放映服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429343\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"122\",\n" + +// " \"name\": \"广播影视服务*互联网电影播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429344\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"123\",\n" + +// " \"name\": \"企业管理服务*物业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429345\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:22:47\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"124\",\n" + +// " \"name\": \"*企业管理服务*其他企业管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429346\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"125\",\n" + +// " \"name\": \"经纪代理服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429347\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"126\",\n" + +// " \"name\": \"经纪代理服务*代理报关服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429348\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"127\",\n" + +// " \"name\": \"经纪代理服务*婚姻介绍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429349\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"128\",\n" + +// " \"name\": \"经纪代理服务*纳税申报代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429350\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"129\",\n" + +// " \"name\": \"经纪代理服务*其他税务事项代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429351\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"130\",\n" + +// " \"name\": \"经纪代理服务*法律代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429352\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"131\",\n" + +// " \"name\": \"经纪代理服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429353\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"132\",\n" + +// " \"name\": \"经纪代理服务*其他经纪代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429354\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"133\",\n" + +// " \"name\": \"人力资源服务*劳务派遣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429355\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"134\",\n" + +// " \"name\": \"人力资源服务*其他人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429356\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"135\",\n" + +// " \"name\": \"商务辅助服务*安全保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429357\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:52\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"136\",\n" + +// " \"name\": \"*现代服务*其他现代服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429358\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"137\",\n" + +// " \"name\": \"建筑服务*工程服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429359\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"138\",\n" + +// " \"name\": \"建筑服务*安装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429360\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"139\",\n" + +// " \"name\": \"建筑服务*修缮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429361\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"140\",\n" + +// " \"name\": \"建筑服务*装饰服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429362\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"141\",\n" + +// " \"name\": \"建筑服务*其他建筑服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429363\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"142\",\n" + +// " \"name\": \"文化体育服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429364\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"143\",\n" + +// " \"name\": \"文化体育服务*体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429365\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"144\",\n" + +// " \"name\": \"教育医疗服务*教育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429366\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"145\",\n" + +// " \"name\": \"教育医疗服务*医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429367\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"146\",\n" + +// " \"name\": \"旅游娱乐服务*旅游服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429368\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"147\",\n" + +// " \"name\": \"旅游娱乐服务*娱乐服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429369\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"148\",\n" + +// " \"name\": \"餐饮住宿服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429370\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"149\",\n" + +// " \"name\": \"餐饮住宿服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429371\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"150\",\n" + +// " \"name\": \"居民日常服务*殡葬服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429372\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"151\",\n" + +// " \"name\": \"居民日常服务*养老服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429373\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"152\",\n" + +// " \"name\": \"居民日常服务*员工制家政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429374\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"153\",\n" + +// " \"name\": \"居民日常服务*育养服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429375\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"154\",\n" + +// " \"name\": \"居民日常服务*其他居民日常服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429376\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:20:08\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"155\",\n" + +// " \"name\": \"*生活服务*其他生活服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031192489947138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"156\",\n" + +// " \"name\": \"租赁服务*融资租赁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031192749993986\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"157\",\n" + +// " \"name\": \"租赁服务*经营租赁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193060372482\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"158\",\n" + +// " \"name\": \"租赁服务*光租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193358168066\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"159\",\n" + +// " \"name\": \"租赁服务*干租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193597243394\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"160\",\n" + +// " \"name\": \"咨询服务*专业税务顾问\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194020868097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"161\",\n" + +// " \"name\": \"咨询服务*税收策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194457075714\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"162\",\n" + +// " \"name\": \"咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194767454210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"163\",\n" + +// " \"name\": \"咨询服务*商务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195065249794\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"164\",\n" + +// " \"name\": \"咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195413377026\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"165\",\n" + +// " \"name\": \"咨询服务*其他涉税服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195732144129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"166\",\n" + +// " \"name\": \"咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196000579586\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"167\",\n" + +// " \"name\": \"咨询服务*会计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196281597954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"168\",\n" + +// " \"name\": \"咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196596170753\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"169\",\n" + +// " \"name\": \"咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196944297986\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"170\",\n" + +// " \"name\": \"咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197246287873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"171\",\n" + +// " \"name\": \"咨询服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197535694850\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"172\",\n" + +// " \"name\": \"咨询服务*医疗咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197871239169\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"173\",\n" + +// " \"name\": \"咨询服务*医疗健康咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198169034754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"174\",\n" + +// " \"name\": \"咨询服务*一般咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198437470210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"175\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198722682882\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"176\",\n" + +// " \"name\": \"运输服务*长途客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199007895553\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"177\",\n" + +// " \"name\": \"运输服务*运输货物打包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199255359489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"178\",\n" + +// " \"name\": \"运输服务*拖车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199477657601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"179\",\n" + +// " \"name\": \"运输服务*铁路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199788036098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"180\",\n" + +// " \"name\": \"运输服务*水上运输辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200073248769\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"181\",\n" + +// " \"name\": \"运输服务*水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200366850050\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"182\",\n" + +// " \"name\": \"运输服务*内河旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200761114625\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"183\",\n" + +// " \"name\": \"运输服务*旅游客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201021161473\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"184\",\n" + +// " \"name\": \"运输服务*陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201281208321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"185\",\n" + +// " \"name\": \"运输服务*陆路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201549643778\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"186\",\n" + +// " \"name\": \"运输服务*客运轮渡运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201868410881\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"187\",\n" + +// " \"name\": \"运输服务*客运服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202241703938\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"188\",\n" + +// " \"name\": \"运输服务*航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202497556481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"189\",\n" + +// " \"name\": \"运输服务*国内铁路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202795352065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"190\",\n" + +// " \"name\": \"运输服务*国内铁路货运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203097341954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"191\",\n" + +// " \"name\": \"运输服务*国内其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203390943234\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"192\",\n" + +// " \"name\": \"运输服务*国内道路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203646795777\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"193\",\n" + +// " \"name\": \"运输服务*国际铁路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203881676801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"194\",\n" + +// " \"name\": \"运输服务*国际铁路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204213026818\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"195\",\n" + +// " \"name\": \"运输服务*国际道路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204447907841\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"196\",\n" + +// " \"name\": \"运输服务*公共自行车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204691177474\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"197\",\n" + +// " \"name\": \"运输服务*道路货物运输\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031205936885762\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"198\",\n" + +// " \"name\": \"运输服务*出租汽车客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031206293401602\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"199\",\n" + +// " \"name\": \"运输服务*出租车客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031207153233921\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"200\",\n" + +// " \"name\": \"邮政服务*其他邮政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031207606218754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"201\",\n" + +// " \"name\": \"邮政服务*基础电信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208180838402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"202\",\n" + +// " \"name\": \"研发与技术服务*研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208470245378\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"203\",\n" + +// " \"name\": \"现代服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208780623873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:09\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"204\",\n" + +// " \"name\": \"*研发和技术服务*研发服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209015504898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"205\",\n" + +// " \"name\": \"研发和技术服务*其他地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209288134657\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"206\",\n" + +// " \"name\": \"研发和技术服务*矿产地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209543987201\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"207\",\n" + +// " \"name\": \"研发和技术服务*基础地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031210944884738\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"208\",\n" + +// " \"name\": \"研发和技术服务*合同能源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211360120833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"209\",\n" + +// " \"name\": \"研发和技术服务*工程勘察勘探服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211712442370\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"210\",\n" + +// " \"name\": \"信息技术服务*桌面管理与维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211930546178\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"211\",\n" + +// " \"name\": \"信息技术服务*在线杀毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212228341761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"212\",\n" + +// " \"name\": \"信息技术服务*虚拟主机服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212547108865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"213\",\n" + +// " \"name\": \"信息技术服务*信息系统应用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212794572802\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"214\",\n" + +// " \"name\": \"信息技术服务*信息系统数据库管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031213058813954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"215\",\n" + +// " \"name\": \"信息技术服务*信息系统数据存储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214266773505\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"216\",\n" + +// " \"name\": \"信息技术服务*信息系统数据处理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214644260866\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"217\",\n" + +// " \"name\": \"信息技术服务*信息系统数据备份服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214900113409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"218\",\n" + +// " \"name\": \"信息技术服务*信息系统容灾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215114022914\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"219\",\n" + +// " \"name\": \"信息技术服务*信息系统集成服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215470538754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"220\",\n" + +// " \"name\": \"信息技术服务*信息系统分析和整合服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215688642562\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"221\",\n" + +// " \"name\": \"信息技术服务*信息技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215902552065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"222\",\n" + +// " \"name\": \"信息技术服务*信息技术基础设施管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031216129044482\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:42:48\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"223\",\n" + +// " \"name\": \"*信息技术服务*信息技术服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031217316032513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"224\",\n" + +// " \"name\": \"信息技术服务*信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031217680936961\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"225\",\n" + +// " \"name\": \"信息技术服务*信息安全服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218033258497\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"226\",\n" + +// " \"name\": \"信息技术服务*物流信息管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218322665473\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"227\",\n" + +// " \"name\": \"信息技术服务*网站维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218591100929\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"228\",\n" + +// " \"name\": \"信息技术服务*网站内容维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218834370562\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"229\",\n" + +// " \"name\": \"信息技术服务*网站建设\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220084273153\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"230\",\n" + +// " \"name\": \"信息技术服务*网络运营服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220340125697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"231\",\n" + +// " \"name\": \"信息技术服务*网络管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220679864321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"232\",\n" + +// " \"name\": \"信息技术服务*托管中心服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220973465602\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"233\",\n" + +// " \"name\": \"信息技术服务*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222156259330\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"234\",\n" + +// " \"name\": \"信息技术服务*税务管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222542135298\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"235\",\n" + +// " \"name\": \"信息技术服务*数据中心服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222978342913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"236\",\n" + +// " \"name\": \"信息技术服务*数据库维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223284527105\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"237\",\n" + +// " \"name\": \"信息技术服务*数据加密\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223582322690\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"238\",\n" + +// " \"name\": \"信息技术服务*数据恢复\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223842369538\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"239\",\n" + +// " \"name\": \"信息技术服务*数据处理和存储支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225096466433\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"240\",\n" + +// " \"name\": \"信息技术服务*数据备份\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225427816450\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"241\",\n" + +// " \"name\": \"信息技术服务*系统设计\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225692057601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"242\",\n" + +// " \"name\": \"信息技术服务*软件维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031226010824705\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"243\",\n" + +// " \"name\": \"信息技术服务*软件外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031227365584898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"244\",\n" + +// " \"name\": \"信息技术服务*软件开发费用\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031227726295041\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"245\",\n" + +// " \"name\": \"信息技术服务*软件测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228032479233\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"246\",\n" + +// " \"name\": \"信息技术服务*人力资源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228472881154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"247\",\n" + +// " \"name\": \"信息技术服务*经营信息管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228770676737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"248\",\n" + +// " \"name\": \"信息技术服务*技术转让\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031229022334978\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"249\",\n" + +// " \"name\": \"信息技术服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031230083493889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"250\",\n" + +// " \"name\": \"信息技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031230922354689\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"251\",\n" + +// " \"name\": \"信息技术服务*计算机软件开发\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231182401537\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"252\",\n" + +// " \"name\": \"信息技术服务*基础信息技术管理平台整合服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231526334466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"253\",\n" + +// " \"name\": \"信息技术服务*呼叫中心管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231832518657\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"254\",\n" + +// " \"name\": \"信息技术服务*供应链管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233157918722\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"255\",\n" + +// " \"name\": \"信息技术服务*电子商务平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233443131393\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"256\",\n" + +// " \"name\": \"信息技术服务*电商平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233711566849\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"257\",\n" + +// " \"name\": \"信息技术服务*电路设计及测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031234214883329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"258\",\n" + +// " \"name\": \"信息技术服务*大数据分析\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031235586420737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"259\",\n" + +// " \"name\": \"信息技术服务*财务经济管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031236051988481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:34:19\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"260\",\n" + +// " \"name\": \"*信息技术服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031236798574593\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"261\",\n" + +// " \"name\": \"信息服务*互联网信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237134118913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"262\",\n" + +// " \"name\": \"现代服务*营销服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237427720193\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"263\",\n" + +// " \"name\": \"现代服务*业务推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237691961345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"264\",\n" + +// " \"name\": \"现代服务*信息技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031238958641154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"265\",\n" + +// " \"name\": \"现代服务*销售推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031239180939266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"266\",\n" + +// " \"name\": \"现代服务费*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031239403237378\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"267\",\n" + +// " \"name\": \"现代服务*直播服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031240565059586\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"268\",\n" + +// " \"name\": \"现代服务*营销推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241051598850\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:10\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"269\",\n" + +// " \"name\": \"*现代服务*音像制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241320034305\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"270\",\n" + +// " \"name\": \"现代服务*音视频服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241651384321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"271\",\n" + +// " \"name\": \"现代服务*业务外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243022921730\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"272\",\n" + +// " \"name\": \"现代服务*信息技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243320717314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"273\",\n" + +// " \"name\": \"现代服务*信息技术外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243580764162\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"274\",\n" + +// " \"name\": \"现代服务*洗车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243828228097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"275\",\n" + +// " \"name\": \"现代服务*物流装卸、搬运、包装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245145239554\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"276\",\n" + +// " \"name\": \"现代服务*物流配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245422063618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"277\",\n" + +// " \"name\": \"现代服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245690499074\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"278\",\n" + +// " \"name\": \"现代服务*文化创意策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031246965567489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"279\",\n" + +// " \"name\": \"现代服务*网络推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031247334666241\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"280\",\n" + +// " \"name\": \"现代服务*市场营销策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031247661821953\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"281\",\n" + +// " \"name\": \"现代服务*市场营销\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031248014143490\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"282\",\n" + +// " \"name\": \"现代服务*市场销售服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031249389875202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"283\",\n" + +// " \"name\": \"现代服务*市场拓展\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031249796722690\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"284\",\n" + +// " \"name\": \"现代服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031250140655618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"285\",\n" + +// " \"name\": \"现代服务*市场售后服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031250467811329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"286\",\n" + +// " \"name\": \"现代服务*市场管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031251742879745\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"287\",\n" + +// " \"name\": \"现代服务*市场策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252124561410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"288\",\n" + +// " \"name\": \"现代服务*设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252455911425\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"289\",\n" + +// " \"name\": \"现代服务*商务信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252783067138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"290\",\n" + +// " \"name\": \"现代服务*商务信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031254041358337\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"291\",\n" + +// " \"name\": \"现代服务*软件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031254301405186\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"292\",\n" + +// " \"name\": \"现代服务*人力资源管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031255568084994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"293\",\n" + +// " \"name\": \"现代服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031255995904002\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"294\",\n" + +// " \"name\": \"现代服务*渠道搭建及使用\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031256289505282\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"295\",\n" + +// " \"name\": \"现代服务*清障服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031256608272386\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"296\",\n" + +// " \"name\": \"现代服务*汽车装饰\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031257774288898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"297\",\n" + +// " \"name\": \"现代服务*汽车美容\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031258088861697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"298\",\n" + +// " \"name\": \"现代服务*汽车检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031258327937025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"299\",\n" + +// " \"name\": \"现代服务*企业管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031259649142786\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"300\",\n" + +// " \"name\": \"现代服务*培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031259904995329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"301\",\n" + +// " \"name\": \"现代服务*居民日常服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261079400449\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"302\",\n" + +// " \"name\": \"现代服务*救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261419139073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"303\",\n" + +// " \"name\": \"现代服务*经济服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261733711873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"304\",\n" + +// " \"name\": \"现代服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263075889154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"305\",\n" + +// " \"name\": \"现代服务*家政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263382073345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"306\",\n" + +// " \"name\": \"现代服务*家庭服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263713423361\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"307\",\n" + +// " \"name\": \"现代服务*技术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031264174796801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"308\",\n" + +// " \"name\": \"现代服务*技术交流\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031265588277250\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"309\",\n" + +// " \"name\": \"现代服务*机动车公共停车管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266058039297\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"310\",\n" + +// " \"name\": \"现代服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266393583617\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"311\",\n" + +// " \"name\": \"现代服务*会展服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266737516546\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"312\",\n" + +// " \"name\": \"现代服务*广告制作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031268100665345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"313\",\n" + +// " \"name\": \"现代服务*广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031268515901441\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"314\",\n" + +// " \"name\": \"现代服务*供应链外包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031269098909698\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"315\",\n" + +// " \"name\": \"现代服务*电梯等设备维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031269593837569\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"316\",\n" + +// " \"name\": \"现代服务*道路救援\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271066038273\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"317\",\n" + +// " \"name\": \"现代服务*代理经纪服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271409971201\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"318\",\n" + +// " \"name\": \"现代服务*代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271753904129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"319\",\n" + +// " \"name\": \"现代服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031272114614274\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"320\",\n" + +// " \"name\": \"现代服务*代办年检\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031273582620674\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"321\",\n" + +// " \"name\": \"现代服务*畜牧业技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031273926553601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"322\",\n" + +// " \"name\": \"现代服务*财务顾问服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031274375344129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"323\",\n" + +// " \"name\": \"现代服务*保洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031275776241665\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"324\",\n" + +// " \"name\": \"现代服务*(市场、网络等)渠道搭建及使用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276111785985\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"325\",\n" + +// " \"name\": \"现代服务*市场营销服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276380221442\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"326\",\n" + +// " \"name\": \"现代服务*市场推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276698988545\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"327\",\n" + +// " \"name\": \"现代服务*市场调查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278104080385\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"328\",\n" + +// " \"name\": \"现代服务*维持秩序服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278431236097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"329\",\n" + +// " \"name\": \"物流辅助服务*专业仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278804529154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"330\",\n" + +// " \"name\": \"物流辅助服务*运输组织服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031280335450113\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"331\",\n" + +// " \"name\": \"物流辅助服务*运输货场仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031280654217218\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"332\",\n" + +// " \"name\": \"物流辅助服务*铁路货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031281270779906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:09\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"333\",\n" + +// " \"name\": \"*物流辅助服务*收派服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031281555992577\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"334\",\n" + +// " \"name\": \"物流辅助服务*商业流通仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031282847838210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"335\",\n" + +// " \"name\": \"物流辅助服务*其他通用航空服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031283133050881\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"336\",\n" + +// " \"name\": \"物流辅助服务*其他航空地面服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031284408119297\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"337\",\n" + +// " \"name\": \"物流辅助服务*其他港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031284760440833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"338\",\n" + +// " \"name\": \"物流辅助服务*其他辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031285121150978\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"339\",\n" + +// " \"name\": \"物流辅助服务*其他仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031286673043458\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"340\",\n" + +// " \"name\": \"物流辅助服务*票务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287096668161\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"341\",\n" + +// " \"name\": \"物流辅助服务*农产品仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287490932737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"342\",\n" + +// " \"name\": \"物流辅助服务*空中交通管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287885197313\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"343\",\n" + +// " \"name\": \"物流辅助服务*客运港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031289349009410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"344\",\n" + +// " \"name\": \"物流辅助服务*客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031289709719553\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"345\",\n" + +// " \"name\": \"物流辅助服务*机场服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031290145927170\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"346\",\n" + +// " \"name\": \"物流辅助服务*货运港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031291395829761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"347\",\n" + +// " \"name\": \"物流辅助服务*货运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031291781705729\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"348\",\n" + +// " \"name\": \"物流辅助服务*货物装卸\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031292196941825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"349\",\n" + +// " \"name\": \"物流辅助服务*货物中转服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031292922556418\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"350\",\n" + +// " \"name\": \"物流辅助服务*货物配载服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031294361202689\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"351\",\n" + +// " \"name\": \"物流辅助服务*货物打包整理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031294805798913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"352\",\n" + +// " \"name\": \"物流辅助服务*货物保管\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031295292338177\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"353\",\n" + +// " \"name\": \"物流辅助服务*航拍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031296819064833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"354\",\n" + +// " \"name\": \"物流辅助服务*航空摄影\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031297360130049\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"355\",\n" + +// " \"name\": \"物流辅助服务*航空培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031297741811713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"356\",\n" + +// " \"name\": \"物流辅助服务*航空勘探\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031298144464898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"357\",\n" + +// " \"name\": \"物流辅助服务*航空降雨\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031299608276994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"358\",\n" + +// " \"name\": \"物流辅助服务*航空护林\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031299943821314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"359\",\n" + +// " \"name\": \"物流辅助服务*航空测量\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031300245811202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"360\",\n" + +// " \"name\": \"物流辅助服务*航空播撒农药\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031301818675202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"361\",\n" + +// " \"name\": \"物流辅助服务*航道疏浚服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031302158413825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"362\",\n" + +// " \"name\": \"物流辅助服务*航道管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031303437676545\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"363\",\n" + +// " \"name\": \"物流辅助服务*道路货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031303940993025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"364\",\n" + +// " \"name\": \"物流辅助服务*打捞救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031304272343042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"365\",\n" + +// " \"name\": \"物流辅助服务*打捞服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031305656463362\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"366\",\n" + +// " \"name\": \"物流辅助服务*船舶移泊服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031306075893761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"367\",\n" + +// " \"name\": \"物流辅助服务*船舶调度服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031306444992514\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"368\",\n" + +// " \"name\": \"物流辅助服务*车辆调度服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031307787169793\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"369\",\n" + +// " \"name\": \"物流辅助服务*车辆挂运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031308152074242\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:20:52\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"370\",\n" + +// " \"name\": \"*物流辅助服务*装卸搬运服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031308596670466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"371\",\n" + +// " \"name\": \"文化创意服务*专业设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031310102425601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"372\",\n" + +// " \"name\": \"文化创意服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031310639296513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"373\",\n" + +// " \"name\": \"文化创意服务*体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031311008395265\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"374\",\n" + +// " \"name\": \"文化创意服务*组织活动服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031311679483906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"375\",\n" + +// " \"name\": \"文化创意服务*直播表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031313202016258\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"376\",\n" + +// " \"name\": \"文化创意服务*文艺创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031313793413122\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"377\",\n" + +// " \"name\": \"文化创意服务*文艺表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031314225426433\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"378\",\n" + +// " \"name\": \"文化创意服务*文艺表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031315630518274\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:48:45\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"379\",\n" + +// " \"name\": \"*文化创意服务*文化创意服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031316062531585\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"380\",\n" + +// " \"name\": \"文化创意服务*文化比赛服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031317333405697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"381\",\n" + +// " \"name\": \"文化创意服务*其他文化艺术经纪代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031317719281666\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"382\",\n" + +// " \"name\": \"文化创意服务*互联网文化活动\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031318113546241\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"383\",\n" + +// " \"name\": \"文化创意服务*档案管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031318868520961\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"384\",\n" + +// " \"name\": \"文化创意服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031319782879233\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"385\",\n" + +// " \"name\": \"文化创意服务*广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031321246691330\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"386\",\n" + +// " \"name\": \"文化创意服务*体育指导服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031321653538818\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"387\",\n" + +// " \"name\": \"文化创意服务*体育训练服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031322983133185\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"388\",\n" + +// " \"name\": \"文化创意服务*体育经纪人服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031323406757889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"389\",\n" + +// " \"name\": \"文化创意服务*体育活动服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031323809411073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"390\",\n" + +// " \"name\": \"文化创意服务*体育管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031325130616834\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"391\",\n" + +// " \"name\": \"文化创意服务*体育表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031325571018754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"392\",\n" + +// " \"name\": \"文化创意服务*体育比赛服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031326846087169\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"393\",\n" + +// " \"name\": \"生活服务*文化娱乐经纪人服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031327210991617\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"394\",\n" + +// " \"name\": \"生活服务*专业保洁、清洗、消毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031328632860673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"395\",\n" + +// " \"name\": \"生活服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031329094234114\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"396\",\n" + +// " \"name\": \"生活服务*钟点服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031330478354434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"397\",\n" + +// " \"name\": \"生活服务*植物养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031330901979138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"398\",\n" + +// " \"name\": \"生活服务*植物养护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031331203969025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"399\",\n" + +// " \"name\": \"生活服务*直播服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031332432900098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"400\",\n" + +// " \"name\": \"生活服务*直播表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031332734889985\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"401\",\n" + +// " \"name\": \"生活服务*照料和护理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031334106427393\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"402\",\n" + +// " \"name\": \"生活服务*医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031334421000194\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"403\",\n" + +// " \"name\": \"生活服务*养生保健服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031335834480641\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"404\",\n" + +// " \"name\": \"生活服务*洗染服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031336207773698\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"405\",\n" + +// " \"name\": \"生活服务*洗车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031337679974402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"406\",\n" + +// " \"name\": \"生活服务*文艺表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031338057461762\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"407\",\n" + +// " \"name\": \"生活服务*文化体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031339345113089\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:19:39\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"408\",\n" + +// " \"name\": \"*生活服务*文化服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031339689046018\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"409\",\n" + +// " \"name\": \"生活服务*外卖递送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031341039611905\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"410\",\n" + +// " \"name\": \"生活服务*体育健康指导\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031341379350530\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"411\",\n" + +// " \"name\": \"生活服务*体育表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031342729916418\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"412\",\n" + +// " \"name\": \"生活服务*摄影扩印服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031343094820865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"413\",\n" + +// " \"name\": \"生活服务*社会看护与帮助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031344407638018\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"414\",\n" + +// " \"name\": \"生活服务*庆典策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031344738988034\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"415\",\n" + +// " \"name\": \"生活服务*汽车美容\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031345988890625\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:18:23\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"416\",\n" + +// " \"name\": \"*生活服务*其他居民日常服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031346290880513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"417\",\n" + +// " \"name\": \"生活服务*旅游娱乐服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031347637252098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:18:45\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"418\",\n" + +// " \"name\": \"*生活服务*旅游服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031348069265409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"419\",\n" + +// " \"name\": \"生活服务*临床检验服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031349369499650\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"420\",\n" + +// " \"name\": \"生活服务*老年人、残疾人养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031350619402242\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"421\",\n" + +// " \"name\": \"生活服务*居民服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031350933975041\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:19:19\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"422\",\n" + +// " \"name\": \"*生活服务*教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031352422952962\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"423\",\n" + +// " \"name\": \"生活服务*健康体检服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031352792051713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:17:28\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"424\",\n" + +// " \"name\": \"*生活服务*家政服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031354171977730\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"425\",\n" + +// " \"name\": \"生活服务*家庭服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031354524299266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"426\",\n" + +// " \"name\": \"生活服务*家居产品维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031355820339202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"427\",\n" + +// " \"name\": \"生活服务*活动策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031356139106305\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"428\",\n" + +// " \"name\": \"生活服务*婚姻介绍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031357468700673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"429\",\n" + +// " \"name\": \"生活服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031357829410817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:17:57\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"430\",\n" + +// " \"name\": \"*生活服务*保洁服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031359150616578\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"431\",\n" + +// " \"name\": \"生活服务*外卖配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361134522369\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"432\",\n" + +// " \"name\": \"商务辅助服务*职业中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361499426817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"433\",\n" + +// " \"name\": \"商务辅助服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361902080001\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"434\",\n" + +// " \"name\": \"商务辅助服务*企业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031363185537025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"435\",\n" + +// " \"name\": \"商务辅助服务*劳务派遣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031363500109825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"436\",\n" + +// " \"name\": \"商务辅助服务*经纪代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031364783566849\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"437\",\n" + +// " \"name\": \"商务辅助服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031365999915010\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"438\",\n" + +// " \"name\": \"商务辅助服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031366373208065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"439\",\n" + +// " \"name\": \"商务辅助服务*代理报关服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369263083522\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"440\",\n" + +// " \"name\": \"劳务*劳务仪器仪表修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369632182273\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"441\",\n" + +// " \"name\": \"劳务*维修服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369942560770\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"442\",\n" + +// " \"name\": \"劳务*通用设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031371100188673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"443\",\n" + +// " \"name\": \"劳务*大型车辆装备修理与维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031371574145025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"444\",\n" + +// " \"name\": \"劳务*修理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031373151203329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"445\",\n" + +// " \"name\": \"劳务*设备维修费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031374032007170\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"446\",\n" + +// " \"name\": \"劳务*电器维修费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031375369990145\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"447\",\n" + +// " \"name\": \"劳务*金属制品修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031375764254722\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"448\",\n" + +// " \"name\": \"劳务*家用电器修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031377068683266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"449\",\n" + +// " \"name\": \"劳务*通讯设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031377429393409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"450\",\n" + +// " \"name\": \"劳务*其他办公设备维修\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031378746404865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"451\",\n" + +// " \"name\": \"劳务*计算机和辅助设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031380050833409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"452\",\n" + +// " \"name\": \"劳务*电气设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031380671590401\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"453\",\n" + +// " \"name\": \"经营租赁*汽车租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031382143791105\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"454\",\n" + +// " \"name\": \"经营租赁*建筑机械租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031382529667073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"455\",\n" + +// " \"name\": \"经营租赁*工程机械租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031383964119042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"456\",\n" + +// " \"name\": \"金融服务*直接收费金融服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031384266108929\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"457\",\n" + +// " \"name\": \"金融服务*账户管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031385499234306\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"458\",\n" + +// " \"name\": \"金融服务*货币兑换服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031386753331202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"459\",\n" + +// " \"name\": \"教育医疗服务*教育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031387135012865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"460\",\n" + +// " \"name\": \"教育医疗服务*招生服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031389274107906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"461\",\n" + +// " \"name\": \"教育医疗服务*考试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031389668372481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"462\",\n" + +// " \"name\": \"教育医疗服务*教育信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031390096191490\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"463\",\n" + +// " \"name\": \"教育医疗服务*教育医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031391429980161\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"464\",\n" + +// " \"name\": \"教育医疗服务*教育测评服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031392285618178\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"465\",\n" + +// " \"name\": \"交通运输服务*液体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031393518743554\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"466\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031393829122050\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"467\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运陆路运输业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031395167105025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"468\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运联运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031395594924033\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"469\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031397138427906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"470\",\n" + +// " \"name\": \"交通运输服务*气体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031397465583618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"471\",\n" + +// " \"name\": \"交通运输服务*其他无运输工具承运业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031398723874817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"472\",\n" + +// " \"name\": \"交通运输服务*其他旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031400049274882\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"473\",\n" + +// " \"name\": \"交通运输服务*其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031400468705281\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"474\",\n" + +// " \"name\": \"交通运输服务*其他管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031401961877506\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"475\",\n" + +// " \"name\": \"交通运输服务*旅客联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031402356142081\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"476\",\n" + +// " \"name\": \"交通运输服务*陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031403786399745\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"477\",\n" + +// " \"name\": \"交通运输服务*货物联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031405057273858\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"478\",\n" + +// " \"name\": \"交通运输服务*航天运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031405405401089\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"479\",\n" + +// " \"name\": \"交通运输服务*固体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031406793715713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"480\",\n" + +// " \"name\": \"鉴证咨询服务*质检技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031408081367042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"481\",\n" + +// " \"name\": \"鉴证咨询服务*物流信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031408597266434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"482\",\n" + +// " \"name\": \"鉴证咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031409935249410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"483\",\n" + +// " \"name\": \"鉴证咨询服务*认证认可服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031410379845633\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"484\",\n" + +// " \"name\": \"鉴证咨询服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031411839463426\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"485\",\n" + +// " \"name\": \"鉴证咨询服务*鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031412263088129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"486\",\n" + +// " \"name\": \"鉴证咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031413462659074\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"487\",\n" + +// " \"name\": \"鉴证咨询服务*工程管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031415006162945\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:37:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"488\",\n" + +// " \"name\": \"*鉴证咨询服务*财务咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031415492702209\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:55:25\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"489\",\n" + +// " \"name\": \"*鉴证咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031416981680130\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"490\",\n" + +// " \"name\": \"鉴证服务*审计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031417371750402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"491\",\n" + +// " \"name\": \"鉴证服务*涉税鉴证\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031418869116930\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"492\",\n" + +// " \"name\": \"鉴证服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031419229827073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"493\",\n" + +// " \"name\": \"鉴证服务*纳税情况审查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031421461196801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"494\",\n" + +// " \"name\": \"鉴证服务*工程监理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031421821906946\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"495\",\n" + +// " \"name\": \"建筑服务*装修费施工\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031422170034177\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"496\",\n" + +// " \"name\": \"建筑服务*钻井服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031423558348801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"497\",\n" + +// " \"name\": \"建筑服务*园林绿化\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031424913108994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"498\",\n" + +// " \"name\": \"建筑服务*设备安装\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031425336733697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"499\",\n" + +// " \"name\": \"建筑服务*绿化工程款\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031426691493889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"500\",\n" + +// " \"name\": \"建筑服务*看管服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031427995922434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"501\",\n" + +// " \"name\": \"建筑服务*建筑装饰服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031428423741442\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"502\",\n" + +// " \"name\": \"建筑服务*建筑修缮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031430172766210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"503\",\n" + +// " \"name\": \"建筑服务*道路养护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031430621556737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"504\",\n" + +// " \"name\": \"建筑服务*爆破服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031431540109314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"505\",\n" + +// " \"name\": \"广播影视服务*制作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031433234608130\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"506\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031433612095489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"507\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031434950078466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"508\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)播映服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031435923156993\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"509\",\n" + +// " \"name\": \"广播影视服务*广播电视集成播控\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031437437300738\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"510\",\n" + +// " \"name\": \"广播影视服务*电影摄制服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031438913695746\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"511\",\n" + +// " \"name\": \"广播影视服务*电影放映\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031440008409090\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"512\",\n" + +// " \"name\": \"电信服务*互联网信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031440968904706\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622457110529\",\n" + +// " \"industryName\": \"餐饮住宿服务\",\n" + +// " \"ticketItem\": \"513\",\n" + +// " \"name\": \"餐饮住宿服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031443250606082\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622457110529\",\n" + +// " \"industryName\": \"餐饮住宿服务\",\n" + +// " \"ticketItem\": \"514\",\n" + +// " \"name\": \"餐饮住宿服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031443674230786\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622729740289\",\n" + +// " \"industryName\": \"保险服务\",\n" + +// " \"ticketItem\": \"515\",\n" + +// " \"name\": \"保险服务*人身保险服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031444072689665\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622729740289\",\n" + +// " \"industryName\": \"保险服务\",\n" + +// " \"ticketItem\": \"516\",\n" + +// " \"name\": \"保险服务*财产保险服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377464798135984130\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:36:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:38:44\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"517\",\n" + +// " \"name\": \"教育辅助服务*教育辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377464930202083329\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:36:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:38:27\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"518\",\n" + +// " \"name\": \"教育辅助服务*教育测评服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377465065174736898\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:37:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:37:59\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"519\",\n" + +// " \"name\": \"教育辅助服务*招生服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1399569637040988161\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-01 11:32:59\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2021-06-01 16:02:53\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"520\",\n" + +// " \"name\": \"生活服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402179019306201090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-08 16:21:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"521\",\n" + +// " \"name\": \"现代服务*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560665964531713\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:38:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-06-09 17:38:39\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"522\",\n" + +// " \"name\": \"现代服务*技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560872777252865\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"523\",\n" + +// " \"name\": \"现代服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560922995654658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"524\",\n" + +// " \"name\": \"现代服务*系统集成服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560972949815298\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"525\",\n" + +// " \"name\": \"现代服务*运行维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561128101314562\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"526\",\n" + +// " \"name\": \"现代服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561186788036610\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"527\",\n" + +// " \"name\": \"现代服务*信息存储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561243759267841\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"528\",\n" + +// " \"name\": \"现代服务*技术研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561303167369218\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"529\",\n" + +// " \"name\": \"*现代服务*技术推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561532411269121\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:41:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"530\",\n" + +// " \"name\": \"现代服务*物业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561588006768642\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:41:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"531\",\n" + +// " \"name\": \"现代服务*企业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561650120196097\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:42:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"532\",\n" + +// " \"name\": \"现代服务*房地产中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562125209030658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"533\",\n" + +// " \"name\": \"*现代服务*房地产咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562176551505922\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"534\",\n" + +// " \"name\": \"现代服务*品牌策划咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562223225700354\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"535\",\n" + +// " \"name\": \"现代服务*法律咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562274568175618\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"536\",\n" + +// " \"name\": \"现代服务*教育咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562327856807937\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:00:26\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"537\",\n" + +// " \"name\": \"*现代服务*市场推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562390674898946\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"538\",\n" + +// " \"name\": \"现代服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562447679684610\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"539\",\n" + +// " \"name\": \"现代服务*市场调查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562505603022849\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"540\",\n" + +// " \"name\": \"现代服务*会展服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562553472614402\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"541\",\n" + +// " \"name\": \"现代服务*影视策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562749610872834\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:46:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"542\",\n" + +// " \"name\": \"广播影视服务*服化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562805948743681\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:46:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"543\",\n" + +// " \"name\": \"广播影视服务*配音服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562881920172034\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:47:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"544\",\n" + +// " \"name\": \"广播影视服务*制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402563229644750849\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:48:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"545\",\n" + +// " \"name\": \"现代服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402563291326185473\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:48:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"546\",\n" + +// " \"name\": \"现代服务*文化活动策划服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564079993769986\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:51:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"547\",\n" + +// " \"name\": \"现代服务*礼仪服务*\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564213448134658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"548\",\n" + +// " \"name\": \"现代服务*文艺创服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564279747497985\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"549\",\n" + +// " \"name\": \"现代服务*健身服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564358822711297\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"550\",\n" + +// " \"name\": \"现代服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564409640878081\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"551\",\n" + +// " \"name\": \"现代服务*洗染服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564467669073921\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"552\",\n" + +// " \"name\": \"现代服务*文化创意服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564534421442561\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"554\",\n" + +// " \"name\": \"现代服务*仪器安装调试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564914563796994\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"553\",\n" + +// " \"name\": \"现代服务*保洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564969622405122\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"555\",\n" + +// " \"name\": \"现代服务*养生保健服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565032532770817\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"556\",\n" + +// " \"name\": \"现代服务*知识产权代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565501053325313\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:57:29\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:48\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"557\",\n" + +// " \"name\": \"*现代服务*图文制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565848043880449\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:58:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"558\",\n" + +// " \"name\": \"现代服务*婚庆服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402566021314793473\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:59:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"559\",\n" + +// " \"name\": \"*现代服务*营销策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569227495276546\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:12:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"560\",\n" + +// " \"name\": \"广告服务*广告设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569501605646338\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"561\",\n" + +// " \"name\": \"设计服务*设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569561563222018\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"562\",\n" + +// " \"name\": \"设计服务*知识产权服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569620434452482\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"563\",\n" + +// " \"name\": \"设计服务*广告制作服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402804944934817793\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:48:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"564\",\n" + +// " \"name\": \"人力资源服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805001197191170\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"565\",\n" + +// " \"name\": \"人力资源服务*外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805068054417410\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"566\",\n" + +// " \"name\": \"人力资源服务*人力资源培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805121875726337\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"567\",\n" + +// " \"name\": \"人力资源服务*高级人才寻访\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1403171867937734657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-11 10:06:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"568\",\n" + +// " \"name\": \"其他咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1408307892926300162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-25 14:15:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"569\",\n" + +// " \"name\": \"信息技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1408329928713191426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-25 15:43:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"570\",\n" + +// " \"name\": \"生活服务*美容服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413035919233024001\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:23:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"571\",\n" + +// " \"name\": \"信息技术服务*审计管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036034710601729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:23:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"572\",\n" + +// " \"name\": \"物流辅助服务*仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036130525282305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:23:04\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"573\",\n" + +// " \"name\": \"*企业管理服务*企业管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036192148000769\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"574\",\n" + +// " \"name\": \"企业管理服务*市场管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036239950479361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"575\",\n" + +// " \"name\": \"企业管理服务*日常综合管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036316320366594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"576\",\n" + +// " \"name\": \"文化服务*图书和资料借阅服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036363334324226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"577\",\n" + +// " \"name\": \"文化服务*文物及非物质遗产保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036425883979778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:25:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"578\",\n" + +// " \"name\": \"文化服务*提供浏览场所服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036483597598721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:25:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"579\",\n" + +// " \"name\": \"教育辅助服务*考试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1415212313908207618\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-14 15:31:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"580\",\n" + +// " \"name\": \"*文化服务*档案管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1416934308379197441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-19 09:33:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"581\",\n" + +// " \"name\": \"经纪代理服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420254425011814401\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-28 13:26:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"582\",\n" + +// " \"name\": \"会展服务*展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420254496730218498\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-28 13:27:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"583\",\n" + +// " \"name\": \"会展服务*会议服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420595466424348673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-29 12:02:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"584\",\n" + +// " \"name\": \"现代服务*汽车服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424557298679902210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-09 10:25:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"585\",\n" + +// " \"name\": \"现代服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999460303298562\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"586\",\n" + +// " \"name\": \"现代服务*其他业务外包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999521728880642\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"587\",\n" + +// " \"name\": \"现代服务*驾驶服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999560803016705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"588\",\n" + +// " \"name\": \"现代服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999628788490241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"589\",\n" + +// " \"name\": \"物流辅助服务*装卸服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1427932739499274241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-18 17:57:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"590\",\n" + +// " \"name\": \"人力资源服务*服务费 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1428172679214592002\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-19 09:51:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"591\",\n" + +// " \"name\": \"*现代服务*信息服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430014895759388673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-24 11:51:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"592\",\n" + +// " \"name\": \"研发和技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430444668214128641\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-25 16:19:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"593\",\n" + +// " \"name\": \"人力资源服务*业务外包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430809481003954177\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-26 16:28:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"594\",\n" + +// " \"name\": \"设计服务*设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1433700621348876290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-03 15:57:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"595\",\n" + +// " \"name\": \"现代服务*培训服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1434797687399624705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-06 16:36:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"596\",\n" + +// " \"name\": \"广告服务*印刷费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435145866938716162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"597\",\n" + +// " \"name\": \"现代服务*信息咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435145959368667137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"598\",\n" + +// " \"name\": \"广告服务*其他广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146050900889602\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"599\",\n" + +// " \"name\": \"设计服务*专业设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146137135779842\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:17\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:55\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"600\",\n" + +// " \"name\": \"*物流辅助服务*分拣服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146201610620930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:28\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"601\",\n" + +// " \"name\": \"*物流辅助服务*收件服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146267247284226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:22:12\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"602\",\n" + +// " \"name\": \"*物流辅助服务*派送服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146323765604354\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:42:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"603\",\n" + +// " \"name\": \"物流辅助服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146430649053186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:42:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"604\",\n" + +// " \"name\": \"企业管理服务*工程项目管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146579391582209\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"605\",\n" + +// " \"name\": \"企业管理服务*其他辅助管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146696735625217\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"606\",\n" + +// " \"name\": \"经纪代理服务*其他经纪服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146768776990721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"607\",\n" + +// " \"name\": \"生活服务*安装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146832194940930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:44:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"608\",\n" + +// " \"name\": \"生活服务*维修服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435427814445789186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:20:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"609\",\n" + +// " \"name\": \"信息技术服务*维护费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435427899883761666\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:20:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"610\",\n" + +// " \"name\": \"信息技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428005701857282\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"611\",\n" + +// " \"name\": \"广告代理服务*广告策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428080565989378\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"612\",\n" + +// " \"name\": \"广告代理服务*广告咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428135163170817\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"613\",\n" + +// " \"name\": \"现代服务*宣传费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428200200048642\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"614\",\n" + +// " \"name\": \"广播影视服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428259251654657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"615\",\n" + +// " \"name\": \"广播影视服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428312460668930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"616\",\n" + +// " \"name\": \"企业管理服务*保洁费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428367284416514\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"617\",\n" + +// " \"name\": \"人力资源服务*劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428409399349250\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"618\",\n" + +// " \"name\": \"人力资源服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428453032767490\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"619\",\n" + +// " \"name\": \"人力资源服务*职业介绍费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428501078446081\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"620\",\n" + +// " \"name\": \"人力资源服务*人员素质测评费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428547131977729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"621\",\n" + +// " \"name\": \"经纪代理服务*代理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428605692776449\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"622\",\n" + +// " \"name\": \"文化服务*创作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428649699414018\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"623\",\n" + +// " \"name\": \"文化服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428721652699137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:24:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"624\",\n" + +// " \"name\": \"旅游服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1439161210128871425\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-18 17:35:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"625\",\n" + +// " \"name\": \"其他咨询服务*技术咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592763472080898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:36\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"626\",\n" + +// " \"name\": \"*现代服务*现代服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592851946725377\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:59:05\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"627\",\n" + +// " \"name\": \"*现代服务*知识产权服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592915645620226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:51\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:59:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"628\",\n" + +// " \"name\": \"*现代服务*宣传推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592981500391426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:06\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:01\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"629\",\n" + +// " \"name\": \"*现代服务*产品推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593062760833025\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:20\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"630\",\n" + +// " \"name\": \"*现代服务*品牌推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593122739384322\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:40\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:47\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"631\",\n" + +// " \"name\": \"*现代服务*互联网推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593173352046594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:04\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"632\",\n" + +// " \"name\": \"*现代服务*信息推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593240087621634\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:08\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:56\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"633\",\n" + +// " \"name\": \"*现代服务*企业形象策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593303941705730\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:23\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"634\",\n" + +// " \"name\": \"*现代服务*社交营销服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593365845438466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:28\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"635\",\n" + +// " \"name\": \"*现代服务*动画制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593432677474305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"636\",\n" + +// " \"name\": \"*现代服务*视频制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593499408855041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:27:10\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:43\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"637\",\n" + +// " \"name\": \"*现代服务*多媒体制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593649304891393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:27:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:31\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"638\",\n" + +// " \"name\": \"*现代服务*音频制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593712584351745\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:53\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"639\",\n" + +// " \"name\": \"*现代服务*网页制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593774672633858\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:08\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"640\",\n" + +// " \"name\": \"*现代服务*形象创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593922240835586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:51\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:29\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"641\",\n" + +// " \"name\": \"*现代服务*音像剪辑服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594046920712194\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:06\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"642\",\n" + +// " \"name\": \"*现代服务*图形制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594114620977153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:37\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:23\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"643\",\n" + +// " \"name\": \"*现代服务*平面图形制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594188080013314\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"644\",\n" + +// " \"name\": \"*现代服务*多媒体制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594263648792577\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:02\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"645\",\n" + +// " \"name\": \"*现代服务*产品开发服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594347593588737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:21\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"646\",\n" + +// " \"name\": \"*现代服务*产品功能开发服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594459149492226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"647\",\n" + +// " \"name\": \"*现代服务*产品创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594523892772865\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:54:16\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"648\",\n" + +// " \"name\": \"*现代服务*产品创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594583938424833\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:28\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:54:43\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"649\",\n" + +// " \"name\": \"*现代服务*产品外观创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594638703456258\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:51:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"650\",\n" + +// " \"name\": \"*现代服务*会务服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594703337680898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:57\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:51:44\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"651\",\n" + +// " \"name\": \"*现代服务*会议服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594796090519554\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:32:19\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:52:06\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"652\",\n" + +// " \"name\": \"*现代服务*产品陈列服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594862914166786\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:32:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:52:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"653\",\n" + +// " \"name\": \"*现代服务*产品展示服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594990752362497\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:05\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:07\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"654\",\n" + +// " \"name\": \"*文化创意服务*文化创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595105483350017\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:23\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"655\",\n" + +// " \"name\": \"*文化创意服务*产品创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595189138743298\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"656\",\n" + +// " \"name\": \"*文化创意服务*平面创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595266297163778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:11\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:01\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"657\",\n" + +// " \"name\": \"*文化创意服务*多媒体创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595333410222081\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:27\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:19\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"658\",\n" + +// " \"name\": \"*文化创意服务*市场营销策划\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595394949046273\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:42\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"659\",\n" + +// " \"name\": \"*文化创意服务*知识产权服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595543863615490\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:35:17\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:45:38\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"660\",\n" + +// " \"name\": \"*研发和技术服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595642505261058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:35:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:36\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"661\",\n" + +// " \"name\": \"*研发和技术服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595725497954306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:58\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"663\",\n" + +// " \"name\": \"*研发和技术服务*仪器设备安装服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595779029852162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:13\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:47:23\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"662\",\n" + +// " \"name\": \"*研发和技术服务*仪器设备维修服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595895002361857\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:47:41\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"664\",\n" + +// " \"name\": \"*研发和技术服务*知识产权信息服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596023805239297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:35:37\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"665\",\n" + +// " \"name\": \"*信息技术服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596105279598594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:46:05\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"666\",\n" + +// " \"name\": \"*信息技术服务*软件服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596217619836930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:58\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:45:24\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"667\",\n" + +// " \"name\": \"*信息技术服务*集成电路开发服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596279611645954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:38:13\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:39:25\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"668\",\n" + +// " \"name\": \"*信息技术服务*其它集成电路服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596361975197697\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:38:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:39:07\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"669\",\n" + +// " \"name\": \"*信息技术服务*技术推广服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596517747453954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:09\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:38:37\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"670\",\n" + +// " \"name\": \"*鉴证咨询服务*咨询服务\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596585590321153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:38:16\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"671\",\n" + +// " \"name\": \"*鉴证咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596640493756417\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:39\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:45\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"672\",\n" + +// " \"name\": \"*鉴证咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596701541855234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:24\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"673\",\n" + +// " \"name\": \"*鉴证咨询服务*工程咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596796387651586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:03\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"674\",\n" + +// " \"name\": \"*鉴证咨询服务*项目咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596853832839170\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:30\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:36:40\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"675\",\n" + +// " \"name\": \"*鉴证咨询服务*心理咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596940076113922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:50\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:02:18\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"676\",\n" + +// " \"name\": \"*鉴证咨询服务*健康咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597023383379969\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:10\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:01:53\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"677\",\n" + +// " \"name\": \"*鉴证咨询服务*旅游咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597082720202754\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:24\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:01:04\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"678\",\n" + +// " \"name\": \"*鉴证咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597152878325761\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:00:44\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"679\",\n" + +// " \"name\": \"*鉴证咨询服务*知识产权咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597309845954561\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:42:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:59:09\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"680\",\n" + +// " \"name\": \"*商务辅助服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": \"3040800000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597421322170369\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:42:45\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:58:21\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"681\",\n" + +// " \"name\": \"*商务辅助服务*居间服务\",\n" + +// " \"ticketItemCode\": \"3040800000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597545733611521\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:57:37\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"683\",\n" + +// " \"name\": \"*企业管理服务*企业管理咨询服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597615996596226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:57:17\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"682\",\n" + +// " \"name\": \"*企业管理服务*企业管理顾问服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597708174815233\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:56:46\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"684\",\n" + +// " \"name\": \"*企业管理服务*企业财务管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597796750123009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:44:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:53:08\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"685\",\n" + +// " \"name\": \"*企业管理服务*企业形象策划服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597891256184834\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:44:37\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:52:03\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"686\",\n" + +// " \"name\": \"*企业管理服务*企业管理战略服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598000421330945\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:45:03\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:51:42\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"687\",\n" + +// " \"name\": \"*企业管理服务*企业管理合规服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598072336871425\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:45:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:51:03\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"688\",\n" + +// " \"name\": \"*企业管理服务*企业管理内训服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598392567783426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:46:36\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:50:39\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"689\",\n" + +// " \"name\": \"*安全保护服务*安全保护服务\",\n" + +// " \"ticketItemCode\": \"3040804000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598528769417218\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:47:09\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:49:34\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"690\",\n" + +// " \"name\": \"*物流辅助服务*物流辅助服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598626362482689\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:47:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:16\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"691\",\n" + +// " \"name\": \"*运输服务*交通运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599069431984130\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:24\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"692\",\n" + +// " \"name\": \"*运输服务*陆路运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599141020360705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:47\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"693\",\n" + +// " \"name\": \"*运输服务*旅客运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599220917657601\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:35:14\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"694\",\n" + +// " \"name\": \"*运输服务*货物运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599298260623362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:26:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"695\",\n" + +// " \"name\": \"*生活服务*生活服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599377369391106\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:54\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"696\",\n" + +// " \"name\": \"*生活服务*体育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599447074529282\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:43\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"697\",\n" + +// " \"name\": \"*生活服务*健身服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599495501967361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:24\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"698\",\n" + +// " \"name\": \"*生活服务*健康服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599608886587393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"699\",\n" + +// " \"name\": \"*生活服务*学历教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599690503548929\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:24:42\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"700\",\n" + +// " \"name\": \"*生活服务*非学历教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599746073878529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:24:15\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"701\",\n" + +// " \"name\": \"*生活服务*教育辅助服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599816731123713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:45\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"702\",\n" + +// " \"name\": \"*生活服务*娱乐服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599878970400769\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:26\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"703\",\n" + +// " \"name\": \"*生活服务*居民日常服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599937824878594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:45\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:11\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"704\",\n" + +// " \"name\": \"*生活服务*修理修配服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1448891771667873794\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-10-15 14:01:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"706\",\n" + +// " \"name\": \"*现代服务*市场营销策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453544049842688002\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 10:08:02\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2021-10-28 10:08:25\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"705\",\n" + +// " \"name\": \"信息技术服务*信息服务费\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656369520545793\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"707\",\n" + +// " \"name\": \"人力资源服务*人才委托招聘\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656440760799233\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"708\",\n" + +// " \"name\": \"经纪代理服务*房屋销售代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656505638293506\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"709\",\n" + +// " \"name\": \"其他咨询服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1482981326448545793\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-01-17 15:41:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2022-01-17 15:41:40\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"710\",\n" + +// " \"name\": \"*物流辅助服务*拣配服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245125419761666\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:39:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"711\",\n" + +// " \"name\": \"现代服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245191534575617\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:39:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"712\",\n" + +// " \"name\": \"现代服务*软件开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245252565893122\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"713\",\n" + +// " \"name\": \"现代服务*软件维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245321448947714\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"714\",\n" + +// " \"name\": \"现代服务*软件测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245414449250306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"715\",\n" + +// " \"name\": \"现代服务*其他软件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245570355724289\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"716\",\n" + +// " \"name\": \"现代服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245636873191426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"717\",\n" + +// " \"name\": \"现代服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245728422264833\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"718\",\n" + +// " \"name\": \"现代服务*相关电路技术支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349531423125505\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:50:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2022-03-17 14:51:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"719\",\n" + +// " \"name\": \"*生活服务*垃圾清运\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349710821896193\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:51:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"720\",\n" + +// " \"name\": \"*生活服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349775779082242\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:51:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"721\",\n" + +// " \"name\": \"*生活服务*园林养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349847908528130\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:52:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"722\",\n" + +// " \"name\": \"*生活服务*园林绿化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349999339679746\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:52:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"723\",\n" + +// " \"name\": \"*生活服务*汽车检测信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350127316283393\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"724\",\n" + +// " \"name\": \"*生活服务*汽车清洗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350189693972482\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"725\",\n" + +// " \"name\": \"*生活服务*汽车保养服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350268500750338\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"726\",\n" + +// " \"name\": \"*生活服务*汽车救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350346326061058\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:54:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"727\",\n" + +// " \"name\": \"*生活服务*汽车拖车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350466786471938\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:54:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"728\",\n" + +// " \"name\": \"*生活服务*商业代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504711899227369474\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-18 14:50:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"729\",\n" + +// " \"name\": \"企业管理服务*企业管理服务*培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1509008794921738241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-30 11:25:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"730\",\n" + +// " \"name\": \"*现代服务*市场调研\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1509008912047677441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-30 11:25:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"731\",\n" + +// " \"name\": \"*广告服务*学术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517341896580567041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:17:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"732\",\n" + +// " \"name\": \"信息技术服务*财务经济管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517341958886952961\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"733\",\n" + +// " \"name\": \"现代服务*项目设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342001387835393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"734\",\n" + +// " \"name\": \"现代服务*法律代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342053514645506\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"735\",\n" + +// " \"name\": \"现代服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342133269336065\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"736\",\n" + +// " \"name\": \"生活服务*汽车检测费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572266743087105\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:00:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"737\",\n" + +// " \"name\": \"*其他咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572323294887938\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:00:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"738\",\n" + +// " \"name\": \"*其他咨询服务*市场调查服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572389782994946\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"739\",\n" + +// " \"name\": \"*生活服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572451967746049\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"740\",\n" + +// " \"name\": \"*企业管理服务*停车场管理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572513670152194\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"741\",\n" + +// " \"name\": \"*会览服务*展览服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572552689762306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"742\",\n" + +// " \"name\": \"*会览服务*会议服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572609933623297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"743\",\n" + +// " \"name\": \"*信息技术服务*测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572650500931586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"744\",\n" + +// " \"name\": \"*信息技术服务*设计费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572708369743874\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"745\",\n" + +// " \"name\": \"*文化服务*文化策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572754217680897\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"746\",\n" + +// " \"name\": \"*设计服务*活动策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572815018311681\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"747\",\n" + +// " \"name\": \"*现代服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1525019031218683906\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-05-13 15:44:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"748\",\n" + +// " \"name\": \"现代服务*维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999578574850\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"749\",\n" + +// " \"name\": \"*会展服务*会务服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999716986881\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"750\",\n" + +// " \"name\": \"*会展服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999775707137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"751\",\n" + +// " \"name\": \"*鉴证咨询服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999830233089\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"752\",\n" + +// " \"name\": \"*鉴证咨询服务*其他鉴证服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999884759042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"753\",\n" + +// " \"name\": \"*鉴证咨询服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999960256514\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"754\",\n" + +// " \"name\": \"*其他现代服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000014782466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"755\",\n" + +// " \"name\": \"*其他咨询服务*财务咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000077697026\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"756\",\n" + +// " \"name\": \"*其他咨询服务*品牌商务合作咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000136417281\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"757\",\n" + +// " \"name\": \"*其他咨询服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000190943234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"758\",\n" + +// " \"name\": \"*其他咨询服务*商务信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000245469186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"759\",\n" + +// " \"name\": \"*其他咨询服务*市场调研服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000299995138\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"760\",\n" + +// " \"name\": \"*其他咨询服务*市场咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000354521090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"761\",\n" + +// " \"name\": \"*其他咨询服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000409047042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"762\",\n" + +// " \"name\": \"*其他咨询服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000463572993\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"763\",\n" + +// " \"name\": \"*其他咨询服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000572624897\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"764\",\n" + +// " \"name\": \"*设计服务*策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000627150849\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"765\",\n" + +// " \"name\": \"*设计服务*产品研发设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000711036930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"766\",\n" + +// " \"name\": \"*设计服务*代理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000769757185\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"767\",\n" + +// " \"name\": \"*设计服务*广告设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000824283137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"768\",\n" + +// " \"name\": \"*设计服务*设计制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000878809090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"769\",\n" + +// " \"name\": \"*设计服务*制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000933335041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"770\",\n" + +// " \"name\": \"*物流辅助服务*仓库打包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000987860994\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"771\",\n" + +// " \"name\": \"*物流辅助服务*仓库打包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001042386945\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"772\",\n" + +// " \"name\": \"*物流辅助服务*货物运输代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001096912898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"773\",\n" + +// " \"name\": \"*物流辅助服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001151438849\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"774\",\n" + +// " \"name\": \"*物流辅助服务*物流装卸费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001205964801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"775\",\n" + +// " \"name\": \"*现代服务*策划创意服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001260490754\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"776\",\n" + +// " \"name\": \"*现代服务*策划宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001315016705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"777\",\n" + +// " \"name\": \"*现代服务*促销推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001369542658\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"778\",\n" + +// " \"name\": \"*现代服务*公用设施维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001424068610\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"779\",\n" + +// " \"name\": \"*现代服务*管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001503760386\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"780\",\n" + +// " \"name\": \"*现代服务*广告策划费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001558286337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"781\",\n" + +// " \"name\": \"*现代服务*广告策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001612812289\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"782\",\n" + +// " \"name\": \"*现代服务*广告设计费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001671532545\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"783\",\n" + +// " \"name\": \"*现代服务*活动执行费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001751224322\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"784\",\n" + +// " \"name\": \"*现代服务*检测服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001809944577\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"785\",\n" + +// " \"name\": \"*现代服务*经纪代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001864470529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"786\",\n" + +// " \"name\": \"*现代服务*勘察技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001918996481\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"787\",\n" + +// " \"name\": \"*现代服务*其他设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001977716737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"788\",\n" + +// " \"name\": \"*现代服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002032242690\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"789\",\n" + +// " \"name\": \"*现代服务*摄影服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002086768641\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"790\",\n" + +// " \"name\": \"*现代服务*市场服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002141294594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"791\",\n" + +// " \"name\": \"*现代服务*市场开拓服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002195820546\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"792\",\n" + +// " \"name\": \"*现代服务*市场咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002254540801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"793\",\n" + +// " \"name\": \"*现代服务*文印晒图服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002309066753\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"794\",\n" + +// " \"name\": \"*现代服务*文印设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002363592706\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"795\",\n" + +// " \"name\": \"*现代服务*现代营销服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002418118658\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"796\",\n" + +// " \"name\": \"*现代服务*研发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002472644609\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"797\",\n" + +// " \"name\": \"*现代服务*制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002527170561\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"798\",\n" + +// " \"name\": \"*现代服务费*经纪服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002585890817\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"799\",\n" + +// " \"name\": \"*信息技术服务*开发课程资源\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002640416770\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"800\",\n" + +// " \"name\": \"*信息技术服务*无线智能系统的维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002720108546\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"801\",\n" + +// " \"name\": \"*研发和技术服务*测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002778828801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"802\",\n" + +// " \"name\": \"*研发和技术服务*技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002833354753\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"803\",\n" + +// " \"name\": \"*研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002892075010\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"804\",\n" + +// " \"name\": \"*研发和技术服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002946600962\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"805\",\n" + +// " \"name\": \"*咨询服务*管理咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843003001126914\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"806\",\n" + +// " \"name\": \"*咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1548971625716666369\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-07-18 18:03:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"807\",\n" + +// " \"name\": \"研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1595712821063114754\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-24 17:35:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"808\",\n" + +// " \"name\": \"现代服务*学术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596068729723035650\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:10:13\",\n" + +// " \"updateBy\": \"yangquan\",\n" + +// " \"updateTime\": \"2022-11-25 17:10:32\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"810\",\n" + +// " \"name\": \"人力资源服务*外包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596068920534556674\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:10:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"809\",\n" + +// " \"name\": \"人力资源服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069274789617666\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:12:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"812\",\n" + +// " \"name\": \"文化服务*文化创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069367215300610\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:12:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"811\",\n" + +// " \"name\": \"文化服务*文化服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069483116503041\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:13:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"813\",\n" + +// " \"name\": \"文化服务*文化策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1597420037273083905\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-29 10:39:50\",\n" + +// " \"updateBy\": \"admin@yrc\",\n" + +// " \"updateTime\": \"2022-11-29 16:10:46\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"815\",\n" + +// " \"name\": \"现代服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465156102447105\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:28:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"816\",\n" + +// " \"name\": \"信息技术服务*互联网营销推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465414643531777\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:29:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"817\",\n" + +// " \"name\": \"体育服务*体育训练服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465495077707778\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:29:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"818\",\n" + +// " \"name\": \"体育服务*体育管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465593450913794\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:30:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"819\",\n" + +// " \"name\": \"教育辅助服务*教育咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465752180154369\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:30:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"820\",\n" + +// " \"name\": \"非学历教育服务*培训服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605762421014716418\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 11:09:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"821\",\n" + +// " \"name\": \"现代服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605762544029450241\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 11:09:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"822\",\n" + +// " \"name\": \"现代服务*市场推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605842163839590401\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 16:26:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"823\",\n" + +// " \"name\": \"现代服务*市场推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1607186010351919105\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-26 09:26:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"824\",\n" + +// " \"name\": \"研发和技术服务*技术开发费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1607577783616192514\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-27 11:23:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"825\",\n" + +// " \"name\": \"*研发和技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648590963372744705\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:34:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"826\",\n" + +// " \"name\": \"研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591180318924801\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:35:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"827\",\n" + +// " \"name\": \"现代服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591271104634881\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:36:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"828\",\n" + +// " \"name\": \"现代服务*健康咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591381574213633\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:36:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"829\",\n" + +// " \"name\": \"现代服务*技术调试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591515997462529\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:37:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"830\",\n" + +// " \"name\": \"现代服务*技术维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591691411644417\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:37:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"831\",\n" + +// " \"name\": \"非学历教育服务*培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1715254273203265538\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-10-20 14:31:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"832\",\n" + +// " \"name\": \"其他咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153657339023362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:18:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:18:38\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"833\",\n" + +// " \"name\": \"*经纪代理服务*代发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153771864494082\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:05\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"834\",\n" + +// " \"name\": \"*人力资源服务*代付服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153826910539778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:18\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"835\",\n" + +// " \"name\": \"*人力资源服务*代付业务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153936302182402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:44\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"836\",\n" + +// " \"name\": \"*人力资源服务*代付个人生产经营所得\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739186988634050562\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-12-25 15:31:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 15:31:05\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"837\",\n" + +// " \"name\": \"现代服务*分拣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739523530627977217\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-12-26 13:48:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-26 13:48:23\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"838\",\n" + +// " \"name\": \"信息技术服务*技术检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090008041885698\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:46:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:46:39\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"839\",\n" + +// " \"name\": \"现代服务*业务宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090074534187009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:46:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:46:54\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"840\",\n" + +// " \"name\": \"企业管理服务*管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090127910899713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:07\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"841\",\n" + +// " \"name\": \"企业管理服务*总部管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090173435875330\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:18\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"842\",\n" + +// " \"name\": \"企业管理服务*投资管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090233452171265\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:32\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"843\",\n" + +// " \"name\": \"企业管理服务*资产管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090316994318338\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:52\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"844\",\n" + +// " \"name\": \"信息技术服务*数据处理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090370769489922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:05\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"845\",\n" + +// " \"name\": \"研发和技术服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090426448875522\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:18\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"846\",\n" + +// " \"name\": \"研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090470111580161\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:29\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"847\",\n" + +// " \"name\": \"研发和技术服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090571219472385\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:53\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"848\",\n" + +// " \"name\": \"研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090654866477058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:49:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:49:13\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"849\",\n" + +// " \"name\": \"物流辅助服务*外卖派送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747891412559474690\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 15:59:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 15:59:21\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"850\",\n" + +// " \"name\": \"现代服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747895966470516737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:27\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"851\",\n" + +// " \"name\": \"物流辅助服务*货物仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896011513147393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:38\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"852\",\n" + +// " \"name\": \"物流辅助服务*商品流通仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896074364792834\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:53\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"853\",\n" + +// " \"name\": \"鉴证咨询服务*鉴证咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896123656253441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:04\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"854\",\n" + +// " \"name\": \"鉴证咨询服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896176332517377\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:17\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"855\",\n" + +// " \"name\": \"鉴证咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896234385879042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:31\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"856\",\n" + +// " \"name\": \"鉴证咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896279533367297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:42\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"857\",\n" + +// " \"name\": \"现代服务*活动策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896338580779010\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:56\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"858\",\n" + +// " \"name\": \"经纪代理服务*经纪代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896391030550529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:08\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"859\",\n" + +// " \"name\": \"经纪代理服务*中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896450811965442\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:22\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"860\",\n" + +// " \"name\": \"现代服务*安全保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896530340163586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:41\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"861\",\n" + +// " \"name\": \"生活服务*驾驶服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747900548118491138\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:35:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:35:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"862\",\n" + +// " \"name\": \"鉴证咨询服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1752954773823303682\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-02-01 15:19:21\",\n" + +// " \"updateBy\": \"admin@songya\",\n" + +// " \"updateTime\": \"2024-02-01 15:20:08\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"1111\",\n" + +// " \"name\": \"现代服务*物流辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591325269340162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:16\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"863\",\n" + +// " \"name\": \"信息技术服务*咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591419108503554\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"864\",\n" + +// " \"name\": \"鉴证咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591464616701954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:50\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"865\",\n" + +// " \"name\": \"经纪代理服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600417282809857\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:11\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"866\",\n" + +// " \"name\": \"现代服务*翻译服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600470558859265\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:24\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"867\",\n" + +// " \"name\": \"设计服务*内部管理设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600510266335234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:33\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"868\",\n" + +// " \"name\": \"设计服务*供应链设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600553211813890\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:44\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"869\",\n" + +// " \"name\": \"设计服务*服装设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600604885639170\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:56\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"870\",\n" + +// " \"name\": \"设计服务*平面设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600676708900865\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:13\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"871\",\n" + +// " \"name\": \"设计服务*包装设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600718488363009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:23\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"872\",\n" + +// " \"name\": \"设计服务*动漫设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600777917456386\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:37\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"873\",\n" + +// " \"name\": \"设计服务*网游设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600814420484098\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:46\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"874\",\n" + +// " \"name\": \"设计服务*网站设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600849765883905\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:54\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"875\",\n" + +// " \"name\": \"设计服务*造型设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600893961265153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:05\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"876\",\n" + +// " \"name\": \"设计服务*创意策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600931647086594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:14\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"877\",\n" + +// " \"name\": \"知识产权服务*知识产权登记服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600983010533378\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:26\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"878\",\n" + +// " \"name\": \"知识产权服务*知识产权鉴定服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601045686018049\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"879\",\n" + +// " \"name\": \"知识产权服务*知识产权评估服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601087654223874\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:51\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"880\",\n" + +// " \"name\": \"知识产权服务*知识产权认证服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601123737821186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:00\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"881\",\n" + +// " \"name\": \"知识产权服务*知识产权检索服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601181514358786\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:13\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"882\",\n" + +// " \"name\": \"广告服务*广告宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601217287577601\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:22\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"883\",\n" + +// " \"name\": \"广告服务*广告展示服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601314264080385\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:45\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"884\",\n" + +// " \"name\": \"企业管理服务*投资与资产管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601366957121537\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:58\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"885\",\n" + +// " \"name\": \"经纪代理服务*知识产权代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601468186648578\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:22\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"886\",\n" + +// " \"name\": \"生活服务*汽车保养检测服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601527234060290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:36\",\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"887\",\n" + +// " \"name\": \"文化服务*组织活动服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601578719141889\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:48\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"888\",\n" + +// " \"name\": \"非学历教育服务*学前教育服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601635543572482\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:48:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:48:02\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"889\",\n" + +// " \"name\": \"非学历教育服务*演讲服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536886344806402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:19\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"890\",\n" + +// " \"name\": \"人力资源服务*项目外包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536924647190529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:28\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"891\",\n" + +// " \"name\": \"人力资源服务*招聘服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536978401390593\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"892\",\n" + +// " \"name\": \"现代服务*绿化养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537019614621697\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"893\",\n" + +// " \"name\": \"现代服务*保养费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537089953099778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:07\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"894\",\n" + +// " \"name\": \"现代服务*居间费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537157032603649\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:23\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"895\",\n" + +// " \"name\": \"现代服务*外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537199181164545\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:33\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"896\",\n" + +// " \"name\": \"现代服务*渠道服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537276838703105\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:52\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"897\",\n" + +// " \"name\": \"生活服务*清洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537337844854785\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:27:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:27:06\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"898\",\n" + +// " \"name\": \"生活服务*物业服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537540735922178\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:27:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:27:55\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"899\",\n" + +// " \"name\": \"生活服务*酒店配套服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537611254755330\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:11\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"900\",\n" + +// " \"name\": \"生活服务*家具产品维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537674873958402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:27\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"901\",\n" + +// " \"name\": \"生活服务*市容市政管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537734365966337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:41\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"902\",\n" + +// " \"name\": \"生活服务*策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537774614507522\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:50\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"903\",\n" + +// " \"name\": \"生活服务*城市配送费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537851319939074\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:29:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:29:09\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"904\",\n" + +// " \"name\": \"生活服务*网约车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778237994947526657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:45:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:45:50\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"905\",\n" + +// " \"name\": \"信息技术服务*信息系统运行维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238050115207169\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:03\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"906\",\n" + +// " \"name\": \"*信息技术服务*物联网技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238103110238210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:16\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"907\",\n" + +// " \"name\": \"*信息技术服务*网络技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238154519822337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:28\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"908\",\n" + +// " \"name\": \"*信息技术服务*数据服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238196752269314\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:38\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"909\",\n" + +// " \"name\": \"*信息技术服务*商务平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238266436435970\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"910\",\n" + +// " \"name\": \"*现代服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238316499648513\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:07\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"911\",\n" + +// " \"name\": \"*现代服务*销售代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238354785255426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:16\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"912\",\n" + +// " \"name\": \"*现代服务*社会调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238415715909633\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:31\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"913\",\n" + +// " \"name\": \"*现代服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238459340865537\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"914\",\n" + +// " \"name\": \"*现代服务*商务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238498725380097\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"915\",\n" + +// " \"name\": \"*现代服务*贸易经纪\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238537078095873\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:48:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:59\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"916\",\n" + +// " \"name\": \"*现代服务*贸易代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238948883251201\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:49:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:49:38\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"917\",\n" + +// " \"name\": \"*现代服务*技术转让服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238994345312257\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:49:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:49:48\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"918\",\n" + +// " \"name\": \"*现代服务*国内贸易代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239044031037441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:00\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"919\",\n" + +// " \"name\": \"*现代服务*办公服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239087299477505\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:11\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"920\",\n" + +// " \"name\": \"*现代服务*物流服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239143100497921\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:24\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"921\",\n" + +// " \"name\": \"*现代服务*检验检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239183332261890\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:34\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"922\",\n" + +// " \"name\": \"物流辅助服务*打包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239239913422850\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:47\",\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"923\",\n" + +// " \"name\": \"*文化服务*文艺创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239275820859394\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:56\",\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"924\",\n" + +// " \"name\": \"*文化服务*文艺表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239324235710466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:07\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"925\",\n" + +// " \"name\": \"*生活服务*植物养殖服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239382133882882\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:21\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"926\",\n" + +// " \"name\": \"*生活服务*养老服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239433216311298\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:33\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"927\",\n" + +// " \"name\": \"*生活服务*消毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239474714755073\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:43\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"928\",\n" + +// " \"name\": \"*生活服务*清洗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239525088346113\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:55\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"929\",\n" + +// " \"name\": \"*生活服务*票务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239587260514305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:10\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"930\",\n" + +// " \"name\": \"*生活服务*居民日常生活服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239631409758210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:20\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"931\",\n" + +// " \"name\": \"*生活服务*美容美发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239693028278274\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:35\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"932\",\n" + +// " \"name\": \"*设计服务*图文设计制作\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239738481950721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:46\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"933\",\n" + +// " \"name\": \"*设计服务*打印复印服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239798347251713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:00\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"934\",\n" + +// " \"name\": \"*企业管理服务*综合管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239853271662593\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:13\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"935\",\n" + +// " \"name\": \"*企业管理服务*项目管理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239943239483394\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:35\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"936\",\n" + +// " \"name\": \"*其他咨询服务*设计优化咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239982091321346\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:44\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"937\",\n" + +// " \"name\": \"*其他咨询服务*内部管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240020695695361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:53\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"938\",\n" + +// " \"name\": \"*其他咨询服务*流程管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240057827868673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:02\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"939\",\n" + +// " \"name\": \"*其他咨询服务*教育咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240096713261058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:11\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"940\",\n" + +// " \"name\": \"*其他咨询服务*健康咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240139025399810\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:21\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"941\",\n" + +// " \"name\": \"*其他咨询服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240178145673218\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:31\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"942\",\n" + +// " \"name\": \"*其他咨询服务*房地产咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240218461323266\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:40\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"943\",\n" + +// " \"name\": \"*其他咨询服务*安全咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240261721374721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:51\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"944\",\n" + +// " \"name\": \"*其他咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240315039367169\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:55:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:55:03\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"945\",\n" + +// " \"name\": \"*其他咨询服务*设计咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240365178077186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:55:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:55:15\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"946\",\n" + +// " \"name\": \"*其他咨询服务*环保咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1790212884265558017\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-05-14 10:49:47\",\n" + +// " \"updateBy\": \"admin@songya\",\n" + +// " \"updateTime\": \"2024-05-14 10:50:00\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"947\",\n" + +// " \"name\": \"*生活服务*后勤服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1791338857564332033\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-05-17 13:24:00\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2024-06-18 10:53:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"948\",\n" + +// " \"name\": \"现代服务*设备操作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1802897233819156481\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-18 10:52:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-18 10:52:51\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"949\",\n" + +// " \"name\": \"现代服务*场务服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805112272407969794\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-24 13:34:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-24 13:34:37\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"950\",\n" + +// " \"name\": \"现代服务*拍摄服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510429583331329\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:56:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:56:45\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"951\",\n" + +// " \"name\": \"建筑服务*劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510482607722498\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:56:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:56:58\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"952\",\n" + +// " \"name\": \"建筑服务*工程款\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510530447953922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:57:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:57:09\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"953\",\n" + +// " \"name\": \"建筑劳务*工程服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510575998095362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:57:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:57:20\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"954\",\n" + +// " \"name\": \"建筑服务*建筑劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245125455859714\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:10\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"955\",\n" + +// " \"name\": \"研发和技术服务*安装技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245168581693441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:21\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"956\",\n" + +// " \"name\": \"研发和技术服务*技术支持服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245204501712898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:29\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"957\",\n" + +// " \"name\": \"研发和技术服务*技术开发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245240081993729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:38\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"958\",\n" + +// " \"name\": \"研发和技术服务*工程勘察勘探服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245296847704066\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:51\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"959\",\n" + +// " \"name\": \"信息技术服务*供应链管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245351818252290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:04\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"960\",\n" + +// " \"name\": \"信息技术服务*网站内容维护服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245388086398977\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:13\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"961\",\n" + +// " \"name\": \"信息技术服务*人力资源流程管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245428087476225\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:23\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"962\",\n" + +// " \"name\": \"信息技术服务*数据库管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245511801589761\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:43\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"963\",\n" + +// " \"name\": \"人力资源服务*外包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " }\n" + +// " ],\n" + +// " \"timestamp\": 1720684216813\n" + +// "}"; +// +// Map resultMap = JsonUtils.parseObject(json, Map.class); +// List list = (List)resultMap.get("result"); +// List insertlist = new ArrayList(); +// Map keyMap = new HashMap(); +// int i = 0 ; +// for(Map m : list) { +// String value =(String)m.get("industryName"); +// String text =(String)m.get("name"); +// MerInvoiceType sd = new MerInvoiceType(); +// +// Object obj = keyMap.get(value); +// +//// if(obj == null){ +// sd.setParentType(value); +// sd.setType(text); +// sd.setCreateTime(new Date()); +// keyMap.put(value,""); +// insertlist.add(sd); +//// } +// i++; +// +// } +// +// this.merInvoiceTypeMapper.insertBatch(insertlist,10000); +// +// } +// +// } +} diff --git a/ruoyi-modules/ruoyi-resource/Dockerfile b/ruoyi-modules/ruoyi-resource/Dockerfile new file mode 100644 index 0000000..6e0df4f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/resource/logs \ + /ruoyi/resource/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/resource + +ENV SERVER_PORT=9204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-resource.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-resource \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-resource/pom.xml b/ruoyi-modules/ruoyi-resource/pom.xml new file mode 100644 index 0000000..2c99da7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/pom.xml @@ -0,0 +1,171 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-resource + + + ruoyi-resource资源服务 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + com.google.zxing + core + 3.5.2 + + + + com.google.zxing + javase + 3.5.2 + + + org.dromara + ruoyi-api-payment + + + + junit + junit + 4.13.2 + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java new file mode 100644 index 0000000..4caa45a --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java @@ -0,0 +1,26 @@ +package org.dromara.resource; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 资源服务 + * + * @author Lion Li + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiResourceApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiResourceApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + + System.out.println("(♥◠‿◠)ノ゙ 资源服务模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java new file mode 100644 index 0000000..a7f3a75 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java @@ -0,0 +1,52 @@ +package org.dromara.resource.controller; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.junziqian.common.bean.sign.JzqBack; +import org.dromara.resource.service.impl.DhqSignServiceImpl; +import org.dromara.resource.service.impl.JzqSignServiceImpl; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title SysDhqSignController + * @description + * @create 2024-05-23 13:46 + */ + +@RestController +@RequestMapping("/sign") +public class SysDhqSignController extends BaseController { + + + @Resource + public JzqSignServiceImpl jzqSignService; + + + /**** + * 接收返回结果 + * @param + * @return + */ + @PostMapping("/accept") + @ResponseBody + public String accept(@RequestParam Map map)throws Exception{ + return this.jzqSignService.accpet(map); + } + + /**** + * 接收返回结果 + * @param + * @return + */ + @PostMapping("/acceptSure") + @ResponseBody + public String acceptSure(@RequestParam Map map)throws Exception{ + return this.jzqSignService.accpetSure(map); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java new file mode 100644 index 0000000..19da5ba --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java @@ -0,0 +1,60 @@ +package org.dromara.resource.controller; + + +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mail.config.properties.MailProperties; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.validation.constraints.NotBlank; +import java.time.Duration; + +/** + * 邮件功能 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/email") +public class SysEmailController extends BaseController { + + private final MailProperties mailProperties; + + /** + * 邮箱验证码 + * + * @param email 邮箱 + */ + @RateLimiter(key = "#email", time = 60, count = 1) + @GetMapping("/code") + public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { + if (!mailProperties.getEnabled()) { + return R.fail("当前系统没有开启邮箱功能!"); + } + String key = GlobalConstants.CAPTCHA_CODE_KEY + email; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + try { + MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); + } catch (Exception e) { + log.error("验证码短信发送异常 => {}", e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java new file mode 100644 index 0000000..506cdb7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java @@ -0,0 +1,100 @@ +package org.dromara.resource.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; +import org.dromara.resource.service.ISysOssConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; + +/** + * 对象存储配置Controller + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oss/config") +public class SysOssConfigController extends BaseController { + + private final ISysOssConfigService iSysOssConfigService; + + /** + * 查询对象存储配置列表 + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { + return iSysOssConfigService.queryPageList(bo, pageQuery); + } + + /** + * 获取对象存储配置详细信息 + * + * @param ossConfigId OSS配置ID + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/{ossConfigId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("ossConfigId") Long ossConfigId) { + return R.ok(iSysOssConfigService.queryById(ossConfigId)); + } + + /** + * 新增对象存储配置 + */ + @SaCheckPermission("system:ossConfig:add") + @Log(title = "对象存储配置", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.insertByBo(bo)); + } + + /** + * 修改对象存储配置 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.updateByBo(bo)); + } + + /** + * 删除对象存储配置 + * + * @param ossConfigIds OSS配置ID串 + */ + @SaCheckPermission("system:ossConfig:remove") + @Log(title = "对象存储配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossConfigIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossConfigIds) { + return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.updateOssConfigStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java new file mode 100644 index 0000000..4e9bb8f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java @@ -0,0 +1,124 @@ +package org.dromara.resource.controller; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssUploadVo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.dromara.resource.service.ISysOssService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oss") +public class SysOssController extends BaseController { + + private final ISysOssService iSysOssService; + + /** + * 查询OSS对象存储列表 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { + return iSysOssService.queryPageList(bo, pageQuery); + } + + /** + * 查询OSS对象基于id串 + * + * @param ossIds OSS对象ID串 + */ +// @SaCheckPermission("system:oss:list") + @GetMapping("/listByIds/{ossIds}") + public R> listByIds(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { + List list = iSysOssService.listByIds(Arrays.asList(ossIds)); + return R.ok(list); + } + + /** + * 上传OSS对象存储 + * + * @param file 文件 + */ +// @SaCheckPermission("system:oss:upload") + @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + SysOssVo oss = iSysOssService.upload(file); + SysOssUploadVo uploadVo = new SysOssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); + } + + /** + * 下载OSS对象存储 + * + * @param ossId OSS对象ID + */ +// @SaCheckPermission("system:oss:download") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + iSysOssService.download(ossId, response); + } + + /** + * 下载OSS对象存储 + * + * @param ossId OSS对象ID + */ +// @SaCheckPermission("system:oss:download") + @PostMapping("/download/{ossId}") + public void downloadPost(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + iSysOssService.download(ossId, response); + } + + + + @PostMapping("/dlurl") + public void downLoadByUrl(String url,HttpServletResponse response)throws Exception{ + this.iSysOssService.downloadByUrl(url,response); + } + + /** + * 删除OSS对象存储 + * + * @param ossIds OSS对象ID串 + */ +// @SaCheckPermission("system:oss:remove") + @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { + return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true)); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java new file mode 100644 index 0000000..e0c8520 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java @@ -0,0 +1,78 @@ +package org.dromara.resource.controller; + + +import cn.hutool.core.util.RandomUtil; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.service.ISysSmsService; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.util.LinkedHashMap; + +/** + * 短信功能 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sms") +public class SysSmsController extends BaseController { + + private final ISysSmsService sysSmsService; + /** + * 短信验证码 + * + * @param phonenumber 用户手机号 + */ + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/code") + public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + // 验证码模板id 自行处理 (查数据库或写死均可) + String templateId = ""; + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); + if (!"OK".equals(smsResponse.getCode())) { + log.error("验证码短信发送异常 => {}", smsResponse); + return R.fail(smsResponse.getMessage()); + } + return R.ok(); + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 15:03 + * 说明:公众号短信验证码 + **/ + @GetMapping("/mpCode") + public R sendMpCode(@NotBlank(message = "站点名称不能为空") String domain, @NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber){ + this.sysSmsService.sendMpSmsCode(domain,phonenumber); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java new file mode 100644 index 0000000..8e3457b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java @@ -0,0 +1,213 @@ +package org.dromara.resource.danmi_sms; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; +import org.dromara.resource.danmi_sms.common.*; +import org.dromara.resource.danmi_sms.config.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +@Service +public class DMSmsUtils { + private static final Logger log = LoggerFactory.getLogger(DMSmsUtils.class); + + @Resource + private Config config; + + @Value("${ruoyi.captchaSMS}") + private int captchaSMS; + + private String accountTip = " 账号: %s ,密码:%s ,请及时登录更改登录密码"; + + public DMSmsResult verificationCode(String sign, String mobile, String code) { + SmsDto smsDto = signJsonToDto(sign); + String params = code; + return execute(mobile, params, smsDto.getVerification()); + } + + public DMSmsResult enterSuccess(String sign, String domain, String title, String mobile, String companyName, String password) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = companyName; + } else { + params = companyName + "," + title + ",http://" + domain; + } + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = params + "," + account; + } else { + String account = String.format(this.accountTip, new Object[] { mobile, "" }).replaceAll(" ,密码:", ""); + params = params + "," + account; + } + return execute(mobile, params, smsDto.getMerchant()); + } + + public DMSmsResult rechargeInfoPush(String sign, String domain, String companyName, String taxSourcesName, String receiptAccount, String receiptBank, String receiptAccountName, String mobile, String routingNumber) { + SmsDto smsDto = signJsonToDto(sign); + if (smsDto != null && StringUtils.isBlank(smsDto.getRechargeInfo())) { + log.error("充值信息发送短信:mobile:" + mobile + ",companyName:" + companyName + ",taxSourcesName:" + taxSourcesName + ",receiptAccount:" + receiptAccount + ",receiptAccountName:" + receiptAccountName + ",routingNumber:" + routingNumber); + return new DMSmsResult(); + } + if (StringUtils.isBlank(routingNumber)) + routingNumber = "无"; + String params = companyName + "," + taxSourcesName + "," + receiptAccountName + "," + receiptBank + "," + receiptAccount + "," + routingNumber; + return execute(mobile, params, smsDto.getRechargeInfo()); + } + + public DMSmsResult invoicePush(String sign, String domain, String companyName, String params, String mobile) { + SmsDto smsDto = signJsonToDto(sign); + if (smsDto != null && StringUtils.isBlank(smsDto.getInvoce())) { + log.error("开票短信推送:mobile:" + mobile + ",companyName:" + companyName + ",params:" + params); + return new DMSmsResult(); + } + params = companyName + "," + params; + return execute(mobile, params, smsDto.getInvoce()); + } + + public DMSmsResult agentSuccess(String sign, String domain, String title, String mobile, String companyName, String password) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = companyName + ","; + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = companyName + "," + account; + } + } else { + params = companyName + "," + title + ",http://" + domain; + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = params + "," + account; + } + } + return execute(mobile, params, smsDto.getAgent()); + } + + public DMSmsResult toSign(String sign, String domain, String mobile, String flowId) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = flowId; + } else { + params = "http://" + domain + "," + flowId; + } + return execute(mobile, params, smsDto.getTosign()); + } + + public DMSmsResult recharge(String sign, String mobile, String companyName, String accountName, String money) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + accountName + "," + money; + return execute(mobile, params, smsDto.getRecharge()); + } + + public DMSmsResult refund(String sign, String mobile, String companyName, String money, String number, String accountName) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + money + "," + number + "," + accountName; + return execute(mobile, params, smsDto.getRefund()); + } + + public DMSmsResult giveout(String sign, String mobile, String companyName, String batchNumber, String successNum, String failNum) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + batchNumber + "," + successNum + "," + failNum; + return execute(mobile, params, smsDto.getGiveout()); + } + + public DMSmsResult balance(String sign, String mobile, String companyName, String accountName, String money) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + accountName + "," + money; + return execute(mobile, params, smsDto.getBalance()); + } + + public DMSmsResult toOnlineSign(String sign, String domain, String mobile, String flowId) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = flowId; + } else { + params = "http://" + domain + "," + flowId; + } + return execute(mobile, params, smsDto.getToOnlineSign()); + } + + private DMSmsResult execute(String mobile, String param, String templateid) { + log.info("短信发送(验证码通知,会员营销):mobile:" + mobile + ",param:" + param + ",templateid:" + templateid); + DMSmsResult dmSmsResult = new DMSmsResult(); + try { + dmSmsResult.setSuccess(true); + if (this.captchaSMS > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("accountSid").append("=").append(this.config.getAccount_sid()); + sb.append("&to").append("=").append(mobile); + try { + sb.append("¶m").append("=").append(URLEncoder.encode(param, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append("&templateid").append("=").append(templateid); + String body = sb.toString() + HttpUtil.createCommonParam(this.config.getAccount_sid(), this.config.getAuth_token()); + String result = HttpUtil.post(this.config.getBase_url(), body); + log.info("短信发送(验证码通知,会员营销):result:" + result); + JSONObject jsonObject = JSONUtil.parseObj(result); + if ("0000".equals(jsonObject.getStr("respCode"))) { + dmSmsResult.setSuccess(true); + dmSmsResult.setSmsId(jsonObject.getStr("smsId")); + } else { + dmSmsResult.setSuccess(false); + dmSmsResult.setErrorMsg(jsonObject.getStr("respDesc")); + } + } + } catch (Exception e) { + e.printStackTrace(); + dmSmsResult.setSuccess(false); + dmSmsResult.setErrorMsg("短信发送失败"); + } + return dmSmsResult; + } + + public DMSmsSendResult getSmsSendResult(Long count) { + log.info("短信发送回执拉取(验证码通知,会员营销):count: {}", count); + DMSmsSendResult sendResult = new DMSmsSendResult(); + try { + sendResult.setSuccess(true); + if (this.captchaSMS > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("accountSid").append("=").append(this.config.getAccount_sid()); + sb.append("&").append("accountId").append("=").append(this.config.getAccount_id()); + sb.append("&").append("count").append("=").append(count); + Long timestamp = Long.valueOf(System.currentTimeMillis()); + String body = sb.toString() + HttpUtil.createParamWithTime(this.config.getAccount_sid(), this.config.getAuth_token(), timestamp); + String baseUrl = this.config.getBase_url().replaceAll("/sendSMS", ""); + String result = HttpUtil.post(baseUrl + "/receipt/pull", body); + JSONObject jsonObject = JSONUtil.parseObj(result); + if ("0000".equals(jsonObject.getStr("respCode"))) { + sendResult.setSuccess(true); + sendResult.setData(JSON.parseArray(jsonObject.getStr("smsResult"), DMSmsSendResultDtl.class)); + } else { + sendResult.setSuccess(false); + sendResult.setErrorMsg(jsonObject.getStr("respDesc")); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.info("短信发送回执拉取(验证码通知,会员营销):result:" + e.getMessage()); + sendResult.setSuccess(false); + sendResult.setErrorMsg("短信发送失败"); + } + return sendResult; + } + + private SmsDto signJsonToDto(String sign) { + String defaultSign = JSON.toJSONString(this.config.getDefalutCode()); + sign = StringUtils.isNotBlank(sign) ? sign : defaultSign; + return (SmsDto)JSON.toJavaObject((JSON)JSON.parseObject(sign), SmsDto.class); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java new file mode 100644 index 0000000..366344e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java @@ -0,0 +1,43 @@ +package org.dromara.resource.danmi_sms.common; + +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + + +@EqualsAndHashCode +public class DMSmsResult implements Serializable { + private boolean success; + + private String errorMsg; + + private String smsId; + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public void setSmsId(String smsId) { + this.smsId = smsId; + } + + public String toString() { + return "DMSmsResult(success=" + isSuccess() + ", errorMsg=" + getErrorMsg() + ", smsId=" + getSmsId() + ")"; + } + + public boolean isSuccess() { + return this.success; + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public String getSmsId() { + return this.smsId; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java new file mode 100644 index 0000000..87bf9c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java @@ -0,0 +1,53 @@ +package org.dromara.resource.danmi_sms.common; + + +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; +@EqualsAndHashCode +public class DMSmsSendResult implements Serializable { + private static final long serialVersionUID = 1L; + + //是否成功 + private boolean success; + + //错误信息 + private String errorMsg; + + //短信回执详情 + private List data; + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public void setData(List data) { + this.data = data; + } + + protected boolean canEqual(Object other) { + return other instanceof DMSmsSendResult; + } + + + public String toString() { + return "DMSmsSendResult(success=" + isSuccess() + ", errorMsg=" + getErrorMsg() + ", data=" + getData() + ")"; + } + + public boolean isSuccess() { + return this.success; + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public List getData() { + return this.data; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java new file mode 100644 index 0000000..70220d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java @@ -0,0 +1,99 @@ +package org.dromara.resource.danmi_sms.common; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +@EqualsAndHashCode +public class DMSmsSendResultDtl implements Serializable { + private static final long serialVersionUID = 1L; + + //到达时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date receiveTime; + + //具体错误码描述 + private String respMessage; + + //计费数量 + private Integer chargingNum; + + //短信发送请求唯一ID + private String smsId; + + //短信发送请求唯一ID + private String phone; + + //响应结果集中返回,短信回执具体状态码 + private String respCode; + + //短信发送状态报告。0:成功;1:失败 + private Integer status; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public void setRespMessage(String respMessage) { + this.respMessage = respMessage; + } + + public void setChargingNum(Integer chargingNum) { + this.chargingNum = chargingNum; + } + + public void setSmsId(String smsId) { + this.smsId = smsId; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public void setStatus(Integer status) { + this.status = status; + } + + protected boolean canEqual(Object other) { + return other instanceof DMSmsSendResultDtl; + } + + public String toString() { + return "DMSmsSendResultDtl(receiveTime=" + getReceiveTime() + ", respMessage=" + getRespMessage() + ", chargingNum=" + getChargingNum() + ", smsId=" + getSmsId() + ", phone=" + getPhone() + ", respCode=" + getRespCode() + ", status=" + getStatus() + ")"; + } + + public Date getReceiveTime() { + return this.receiveTime; + } + + public String getRespMessage() { + return this.respMessage; + } + + public Integer getChargingNum() { + return this.chargingNum; + } + + public String getSmsId() { + return this.smsId; + } + + public String getPhone() { + return this.phone; + } + + public String getRespCode() { + return this.respCode; + } + + public Integer getStatus() { + return this.status; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java new file mode 100644 index 0000000..990d996 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java @@ -0,0 +1,86 @@ +package org.dromara.resource.danmi_sms.common; + +import org.apache.commons.codec.digest.DigestUtils; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.URL; +import java.net.URLConnection; + +public class HttpUtil { + public static String createCommonParam(String sid, String token) { + long timestamp = System.currentTimeMillis(); + String sig = DigestUtils.md5Hex(sid + token + timestamp); + return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=1"; + } + + public static String post(String url, String body) { + System.out.println("body:" + System.lineSeparator() + body); + String result = ""; + try { + OutputStreamWriter out = null; + BufferedReader in = null; + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(5000); + conn.setReadTimeout(20000); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + out.write(body); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line = ""; + boolean firstLine = true; + while ((line = in.readLine()) != null) { + if (firstLine) { + firstLine = false; + } else { + result = result + System.lineSeparator(); + } + result = result + line; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static String postHuiDiao(String url, String body) { + String result = ""; + try { + OutputStreamWriter out = null; + BufferedReader in = null; + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(5000); + conn.setReadTimeout(20000); + out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + out.write(body); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line = ""; + boolean firstLine = true; + while ((line = in.readLine()) != null) { + if (firstLine) { + firstLine = false; + } else { + result = result + System.lineSeparator(); + } + result = result + line; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static String createParamWithTime(String sid, String token, Long timestamp) { + String sig = DigestUtils.md5Hex(sid + token + timestamp); + return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=UTF-8"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java new file mode 100644 index 0000000..53d777b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java @@ -0,0 +1,51 @@ +package org.dromara.resource.danmi_sms.common; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@EqualsAndHashCode +@Data +public class SmsDto { + private Integer unified; + + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java new file mode 100644 index 0000000..2b34bec --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java @@ -0,0 +1,68 @@ +package org.dromara.resource.danmi_sms.config; + +import lombok.EqualsAndHashCode; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "danmisms") +@EqualsAndHashCode +public class Config { + private String base_url; + + private String account_sid; + + private String auth_token; + + private SmsConfig defalutCode; + + private String account_id; + + public void setBase_url(String base_url) { + this.base_url = base_url; + } + + public void setAccount_sid(String account_sid) { + this.account_sid = account_sid; + } + + public void setAuth_token(String auth_token) { + this.auth_token = auth_token; + } + + public void setDefalutCode(SmsConfig defalutCode) { + this.defalutCode = defalutCode; + } + + public void setAccount_id(String account_id) { + this.account_id = account_id; + } + + protected boolean canEqual(Object other) { + return other instanceof Config; + } + + public String toString() { + return "Config(base_url=" + getBase_url() + ", account_sid=" + getAccount_sid() + ", auth_token=" + getAuth_token() + ", defalutCode=" + getDefalutCode() + ", account_id=" + getAccount_id() + ")"; + } + + public String getBase_url() { + return this.base_url; + } + + public String getAccount_sid() { + return this.account_sid; + } + + public String getAuth_token() { + return this.auth_token; + } + + public SmsConfig getDefalutCode() { + return this.defalutCode; + } + + public String getAccount_id() { + return this.account_id; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java new file mode 100644 index 0000000..0a7b594 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java @@ -0,0 +1,48 @@ +package org.dromara.resource.danmi_sms.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode +@Data +public class SmsConfig { + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java new file mode 100644 index 0000000..956219f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java @@ -0,0 +1,31 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusMerchantAgreement + * @description + * @create 2024-05-29 16:28 + */ + + + +@Data +public class BusMerchantAgreement implements Serializable { + + //合同编号 + private String no; + + //签约状态(1:签约成功 2:签约失败) + private Integer status; + + //协议链接 + private String fileUrl; + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java new file mode 100644 index 0000000..a966fa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java @@ -0,0 +1,19 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusOperatorAgreement + * @description + * @create 2024-05-29 16:34 + */ +@Data +public class BusOperatorAgreement implements Serializable { + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java new file mode 100644 index 0000000..55b9fe9 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java @@ -0,0 +1,57 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title DhqSignVo + * @description 大鸿签请求实体类 + * @create 2024-05-15 14:57 + */ + +@Data +public class DhqSign implements Serializable { + + //应用ID + private String applicationId; + + + private String launchName; + + //合作账户 ID + private String businessId; + + //发起类型 0-个人 1-企业 + private String launchType; + + //发起用户手机号 + private String launchSubject; + + //发起企业名称(launchType 为 1 企业发 + //起合同时必传) + private String launchEnterpriseName; + + //客户发起时定义的编号 + private String customerOriginationNumber; + + //模板编号 + private String contractModelNum; + + //静默签署企业名 +// private String signEnterpriseName; + + //合同名称 + private String contractName; + + //签署人信息 (json 格式字符串) + private String signatoryInfos; + + private List inputValues; + + private Integer signatureType = 0; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java new file mode 100644 index 0000000..d8fd08b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java @@ -0,0 +1,35 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title MerTaskEnroll + * @description + * @create 2024-05-29 15:58 + */ + +@Data +public class MerTaskEnroll implements Serializable { + + + //合同编号 + private String signNo; + + + //任务确认书文件地址 + private String taskConfirmFile; + + + //任务确认书签约状态 0 签署中 1 签署完成 2-拒绝签署 3 解除中 4 解除完成 5 拒绝解除 6-已撤回 7 已过期 + private Integer signStatus; + + + + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java new file mode 100644 index 0000000..ae4c941 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java @@ -0,0 +1,33 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/*** + * 大鸿签-签署人 + */ +@Data +class PcSignatoryDto implements Serializable { + + //签署人姓名 + private String userName; + + //签署人电话 + private String userPhone; + + + //企业名称(Type=1 时必传) + private String enterpriseName; + + //签署印章 1 用户手绘章 2 用户模板章 3 + //企业章 4 合同章 5 法人章 + private String signMode; + + // + private Integer signLevel; + //类型 0-个人 1-企业 + private Integer type; + private String signType; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java new file mode 100644 index 0000000..8a1cc4f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java @@ -0,0 +1,50 @@ +package org.dromara.resource.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * OSS对象存储对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss") +public class SysOss extends TenantEntity { + + /** + * 对象存储主键 + */ + @TableId(value = "oss_id") + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java new file mode 100644 index 0000000..aebc56e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java @@ -0,0 +1,90 @@ +package org.dromara.resource.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 对象存储配置对象 sys_oss_config + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss_config") +public class SysOssConfig extends BaseEntity { + + /** + * 主建 + */ + @TableId(value = "oss_config_id") + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + + /** + * 是否https(0否 1是) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java new file mode 100644 index 0000000..30b14de --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java @@ -0,0 +1,68 @@ +package org.dromara.resource.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 合同签约日志对象 sys_sign_log + * + * @author LionLi + * @date 2024-05-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_sign_log") +public class SysSignLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 业务合同ID + */ + private String bizId; + + /** + * 合同编号 + */ + private String htCode; + + /** + * 第三方业务ID + */ + private String thirdId; + + /** + * 合同类型 + */ + private String htType; + + /** + * 内容 + */ + private String content; + + + private String sendBody; + + private String resultException; + + private String signState; + + private String contractFile; + + private String appId; + + @TableField(exist = false) + private Long createDept; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java new file mode 100644 index 0000000..54ebbec --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java @@ -0,0 +1,127 @@ +package org.dromara.resource.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 短信对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_sms") +public class SysSms extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * 创建者 + */ + @TableField(exist = false) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField(exist = false) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + private String vType; + + /** + * 发送人姓名 + */ + private String vUserName; + + /** + * 发送人ID + */ + private Long iUserId; + + /** + * 发送手机号 + */ + private String vPhone; + + /** + * 验证码 + */ + private String vVerCode; + + /** + * 模版id + */ + private String vTempId; + + /** + * 发送内容 + */ + private String vSendContent; + + /** + * 发送时间 + */ + private Date dtmSendTime; + + /** + * 过期时间 + */ + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java new file mode 100644 index 0000000..d307869 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java @@ -0,0 +1,26 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkAuth + * @description + * @create 2024-05-29 16:39 + */ +@Data +public class UserWorkAuth implements Serializable { + + //合同编号 + private String no; + + //签约文件地址 + private String signFileUrl; + + //签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + private Integer signStatus; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java new file mode 100644 index 0000000..0a6ffd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java @@ -0,0 +1,27 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBiz + * @description + * @create 2024-05-23 14:40 + */ +@Data +public class UserWorkerBiz implements Serializable { + + + private String no; + + private String signFileUrl; + + + private Integer signStatus; + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java new file mode 100644 index 0000000..0f399db --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java @@ -0,0 +1,49 @@ +package org.dromara.resource.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.resource.domain.SysOss; + +/** + * OSS对象存储分页查询对象 sys_oss + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOss.class, reverseConvertGenerate = false) +public class SysOssBo extends BaseEntity { + + /** + * ossId + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java new file mode 100644 index 0000000..d3aa801 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java @@ -0,0 +1,111 @@ +package org.dromara.resource.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.resource.domain.SysOssConfig; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +/** + * 对象存储配置业务对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOssConfig.class, reverseConvertGenerate = false) +public class SysOssConfigBo extends BaseEntity { + + /** + * 主建 + */ + @NotNull(message = "主建不能为空", groups = {EditGroup.class}) + private Long ossConfigId; + + /** + * 配置key + */ + @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "configKey长度必须介于2和20 之间") + private String configKey; + + /** + * accessKey + */ + @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "accessKey长度必须介于2和100 之间") + private String accessKey; + + /** + * 秘钥 + */ + @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "secretKey长度必须介于2和100 之间") + private String secretKey; + + /** + * 桶名称 + */ + @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "bucketName长度必须介于2和100之间") + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "endpoint长度必须介于2和100之间") + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 域 + */ + private String region; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java new file mode 100644 index 0000000..b93da2b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java @@ -0,0 +1,98 @@ +package org.dromara.resource.domain.bo; + +import org.dromara.resource.domain.SysSms; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 短信业务对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSms.class, reverseConvertGenerate = false) +public class SysSmsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + @NotNull(message = "短信类型 1 登录验证码 2 支付验证码 3 其它不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer iType; + + /** + * 发送人姓名 + */ + @NotBlank(message = "发送人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vUserName; + + /** + * 发送人ID + */ + @NotNull(message = "发送人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long iUserId; + + /** + * 发送手机号 + */ + @NotBlank(message = "发送手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vPhone; + + /** + * 验证码 + */ + @NotBlank(message = "验证码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vVerCode; + + /** + * 模版id + */ + @NotBlank(message = "模版id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vTempId; + + /** + * 发送内容 + */ + @NotBlank(message = "发送内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vSendContent; + + /** + * 发送时间 + */ + @NotNull(message = "发送时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date dtmSendTime; + + /** + * 过期时间 + */ + @NotNull(message = "过期时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + @NotNull(message = "是否使用 1 是 0 否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + @NotNull(message = "状态 0 未发送 1 成功 2失败不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java new file mode 100644 index 0000000..33bfd87 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.resource.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.domain.SysSms; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysClientVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java new file mode 100644 index 0000000..dc4046f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java @@ -0,0 +1,96 @@ +package org.dromara.resource.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.resource.domain.SysOssConfig; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对象存储配置视图对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Data +@AutoMapper(target = SysOssConfig.class) +public class SysOssConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主建 + */ + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java new file mode 100644 index 0000000..14d7dc7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java @@ -0,0 +1,34 @@ +package org.dromara.resource.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class SysOssUploadVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java new file mode 100644 index 0000000..aa2957b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java @@ -0,0 +1,72 @@ +package org.dromara.resource.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.resource.domain.SysOss; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * OSS对象存储视图对象 sys_oss + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysOss.class) +public class SysOssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 上传人 + */ + private Long createBy; + + /** + * 上传人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java new file mode 100644 index 0000000..3f07043 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java @@ -0,0 +1,68 @@ +package org.dromara.resource.domain.vo; + +import org.dromara.resource.domain.SysSignLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 合同签约日志视图对象 sys_sign_log + * + * @author LionLi + * @date 2024-05-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSignLog.class) +public class SysSignLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 业务合同ID + */ + @ExcelProperty(value = "业务合同ID") + private String bizId; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String htCode; + + /** + * 第三方业务ID + */ + @ExcelProperty(value = "第三方业务ID") + private String thirdId; + + /** + * 合同类型 + */ + @ExcelProperty(value = "合同类型") + private String htType; + + /** + * 内容 + */ + @ExcelProperty(value = "内容") + private String content; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java new file mode 100644 index 0000000..fe2ea50 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java @@ -0,0 +1,106 @@ +package org.dromara.resource.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.resource.domain.SysSms; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 短信视图对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSms.class) +public class SysSmsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + @ExcelProperty(value = "短信类型 1 登录验证码 2 支付验证码 3 其它") + private Integer iType; + + /** + * 发送人姓名 + */ + @ExcelProperty(value = "发送人姓名") + private String vUserName; + + /** + * 发送人ID + */ + @ExcelProperty(value = "发送人ID") + private Long iUserId; + + /** + * 发送手机号 + */ + @ExcelProperty(value = "发送手机号") + private String vPhone; + + /** + * 验证码 + */ + @ExcelProperty(value = "验证码") + private String vVerCode; + + /** + * 模版id + */ + @ExcelProperty(value = "模版id") + private String vTempId; + + /** + * 发送内容 + */ + @ExcelProperty(value = "发送内容") + private String vSendContent; + + /** + * 发送时间 + */ + @ExcelProperty(value = "发送时间") + private Date dtmSendTime; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + @ExcelProperty(value = "是否使用 1 是 0 否") + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + @ExcelProperty(value = "状态 0 未发送 1 成功 2失败") + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java new file mode 100644 index 0000000..a18b474 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java @@ -0,0 +1,64 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SignType; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteDhqService; +import org.dromara.resource.api.domain.RemoteDhq; +import org.dromara.resource.domain.DhqSign; +import org.dromara.resource.service.impl.DhqSignServiceImpl; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhqServiceImpl + * @description + * @create 2024-05-20 9:55 + */ + + +@DubboService +@Service +public class RemoteDhqServiceImpl implements RemoteDhqService { + + + @Resource + public DhqSignServiceImpl dhqSignService; + + + @DubboReference + private RemoteConfigService remoteConfigService; + @Override + public String becomeSign(RemoteDhq sign, String domain, SignType signType) throws Exception { +// RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); +// +// if(site == null || StringUtils.isEmpty(site.getSignConfig())){ +// throw new Exception("未找到该域名的大鸿签签约配置信息"); +// } +// +// JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); +// +// sign.setApplicationId(signConfig.getString("appId")); +// sign.setBusinessId(signConfig.getString("businessId")); +// +// if(StringUtils.isEmpty(sign.getContractModelNum())){ +// if(1 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_pro")); +// }else if(2 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_conf")); +// } +// } + DhqSign dhqSign = BeanUtil.copyProperties(sign,DhqSign.class); + + return this.dhqSignService.becomeSign(dhqSign); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java new file mode 100644 index 0000000..5516cfd --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java @@ -0,0 +1,73 @@ +package org.dromara.resource.dubbo; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.service.ISysOssService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 文件请求处理 + * + * @author Lion Li + */ +@Slf4j +@Primary +@Service +@RequiredArgsConstructor +@DubboService +public class RemoteFileServiceImpl implements RemoteFileService { + + private final ISysOssService sysOssService; + + /** + * 文件上传请求 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException { + try { + String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix, contentType); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalFilename); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteFile sysFile = new RemoteFile(); + sysFile.setOssId(oss.getOssId()); + sysFile.setName(uploadResult.getFilename()); + sysFile.setUrl(uploadResult.getUrl()); + return sysFile; + } catch (Exception e) { + log.error("上传文件失败", e); + throw new ServiceException("上传文件失败"); + } + } + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + @Override + public String selectUrlByIds(String ossIds) { + return sysOssService.selectUrlByIds(ossIds); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java new file mode 100644 index 0000000..66f5570 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java @@ -0,0 +1,109 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteJzq; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.service.impl.JzqSignServiceImpl; +import org.dromara.system.api.RemoteConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteJzqServiceImpl + * @description + * @create 2024-05-20 9:55 + */ + + +@DubboService +@Service +public class RemoteJzqServiceImpl implements RemoteJzqService { + + + private static final Logger log = LoggerFactory.getLogger(RemoteJzqServiceImpl.class); + @Resource + public JzqSignServiceImpl JzqSignService; + + + @DubboReference + private RemoteConfigService remoteConfigService; + + public String becomeSign(RemoteJzq sign, String domain, SignType signType) { +// RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); +// +// if(site == null || StringUtils.isEmpty(site.getSignConfig())){ +// throw new Exception("未找到该域名的大鸿签签约配置信息"); +// } +// +// JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); +// +// sign.setApplicationId(signConfig.getString("appId")); +// sign.setBusinessId(signConfig.getString("businessId")); +// +// if(StringUtils.isEmpty(sign.getContractModelNum())){ +// if(1 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_pro")); +// }else if(2 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_conf")); +// } +// } + JzqSign JzqSign = BeanUtil.copyProperties(sign,JzqSign.class); + return this.JzqSignService.becomeSign(JzqSign); + } + + + public String link(String applyNo, String fullName, String identityCard, int identityType) { + return this.JzqSignService.link(applyNo,fullName,identityCard,identityType); + } + + + public String bankThreeVerify(String name, String identityCard, String cardNo) { + return JzqSignService.bankThreeVerify(name,identityCard,cardNo); + } + + public String userValid(String name ,String identityCard){ + return JzqSignService.userValid(name,identityCard); + } + + + public String ocrIdentity(String file, Integer front) { + return JzqSignService.ocrIdentity(file,front); + } + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + return JzqSignService.bankFourVerify(name,identityCard,cardNo,mobilePhone); + } + + public String ocrBank(File file){ + return JzqSignService.ocrBank(file); + } + + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + return JzqSignService.startH5Face(orderNo,name,identityCard,backUrl,startFrom); + } + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + return JzqSignService.organizationCreate(emailOrMobile,name,organizationType,identificationType,organizationRegNo,organizationRegImg,legalName,legalIdentityCard,legalMobile); + } + + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + return JzqSignService.cloudCertiPerInfo(fullName,identityCard,idenFront,idenReverse); + } + + public String linkFile(String applyNo){ + return JzqSignService.linkFile(applyNo); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java new file mode 100644 index 0000000..81badff --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.resource.dubbo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.resource.api.RemoteMailService; +import org.springframework.stereotype.Service; + +/** + * 邮件服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMailServiceImpl implements RemoteMailService { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + public void send(String to, String subject, String text) throws ServiceException { + MailUtils.sendText(to, subject, text); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java new file mode 100644 index 0000000..d8f6def --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java @@ -0,0 +1,42 @@ +package org.dromara.resource.dubbo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.resource.api.RemoteMessageService; +import org.springframework.stereotype.Service; + +/** + * 短信服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMessageServiceImpl implements RemoteMessageService { + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + @Override + public void sendMessage(Long sessionKey, String message) { + WebSocketUtils.sendMessage(sessionKey, message); + } + + /** + * 发布订阅的消息(群发) + * + * @param message 消息内容 + */ + @Override + public void publishAll(String message) { + WebSocketUtils.publishAll(message); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java new file mode 100644 index 0000000..4aefcdc --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java @@ -0,0 +1,153 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sms.config.SmsProperties; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.danmi_sms.DMSmsUtils; +import org.dromara.resource.danmi_sms.common.DMSmsResult; +import org.dromara.resource.service.ISysSmsService; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 短信服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSmsServiceImpl implements RemoteSmsService { + + + @Resource + public ISysSmsService sysSmsService; + + private final SysSmsMapper baseMapper; + + @Resource + private SmsProperties smsProperties; + + @DubboReference + private RemoteConfigService remoteConfigService; + + @Autowired + private DMSmsUtils dmSmsUtils; + + /** + * 发送短信 + * + * @param phones 电话号(多个逗号分割) + * @param templateId 模板id + * @param param 模板对应参数 + */ + public RemoteSms send(String phones, String templateId, LinkedHashMap param) throws ServiceException { + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, param); + RemoteSms sysSms = new RemoteSms(); + sysSms.setIsSuccess(smsResponse.isSuccess()); + sysSms.setMessage(smsResponse.getMessage()); + sysSms.setResponse(JsonUtils.toJsonString(smsResponse)); + return sysSms; + } + + + + @Override + public Boolean sendSmsCode(SmsType smsType, String phonenumber, LinkedHashMap param, Map smsConfig) { + return this.sysSmsService.sendSmsCode(smsType,phonenumber,param,smsConfig); + + } + + public RemoteSms send(String domain, String phone, SmsType smsType, LinkedHashMap param) throws ServiceException { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null){ + throw new ServiceException("不支持短信"); + } + if(site.getOpenSms() != 1 || StringUtils.isBlank(site.getSmsConfig())){ + throw new ServiceException("未开通短信"); + } + JSONObject smsConfig = JSONObject.parseObject(site.getSmsConfig()); + + + DMSmsResult result = this.dmSmsUtils.verificationCode(site.getSmsConfig(), phone, param.get("code")); + if(!result.isSuccess()){ + log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phone, result.getErrorMsg()); + } + + + java.util.Date currentDate = DateUtil.date().toJdkDate(); +// SmsBlend smsBlend = null; +// SmsResponse smsResponse = null; +// String smsFacType = "tencent"; +// if(StringUtils.isNotEmpty(smsProperties.getType())){ +// smsFacType = smsProperties.getType(); +// } +// switch (smsFacType){ +// case "aliyun": +// smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA, AlibabaConfig.builder().accessKeyId(smsConfig.getString("accid_aliyun")) +// .accessKeySecret(smsConfig.getString("acckey_aliyun")).signature(smsConfig.getString("sign_aliyun")).build()); +// smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()+"_aliyun"), param); +// break; +// case "tencent": +// smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,TencentConfig.builder().sdkAppId(smsConfig.getString("appid")).accessKeyId(smsConfig.getString("accid")) +// .accessKeySecret(smsConfig.getString("acckey")).signature(smsConfig.getString("sign")).build()); +// smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()), param); +// break; +// } +// SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,TencentConfig.builder().sdkAppId(smsConfig.getString("appid")).accessKeyId(smsConfig.getString("accid")) +// .accessKeySecret(smsConfig.getString("acckey")).signature(smsConfig.getString("sign")).build()); +// SmsResponse smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()), param); +// if (!"OK".equals(smsResponse.getCode())) { +// log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phone, smsResponse); +// } + SysSms smsEntity = new SysSms(); + smsEntity.setIUserId(LoginHelper.getUserId()); + smsEntity.setVTempId(smsType.getTempId()); + smsEntity.setDtmSendTime(currentDate); + smsEntity.setVType(smsType.getDesc()); + String msg = smsConfig.getString("templateContent"); + if(StringUtils.isNotBlank(msg)){ + Iterator paramIter = param.entrySet().iterator(); + int paramIndex = 1; + while(paramIter.hasNext()) { + Map.Entry entry = (Map.Entry)paramIter.next(); + msg = msg.replace("{"+paramIndex+"}",entry.getValue()); + paramIndex++; + } + smsEntity.setVSendContent(msg); + } + + smsEntity.setCreateTime(currentDate); + smsEntity.setVPhone(phone); + smsEntity.setDtmExpirTime(DateUtil.offsetMinute(currentDate,smsType.getExpireTime())); + this.baseMapper.insert(smsEntity); + return MapstructUtils.convert(smsEntity,RemoteSms.class); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java new file mode 100644 index 0000000..f73f823 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java @@ -0,0 +1,224 @@ +package org.dromara.resource.dubbo; + + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ZipUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.service.ISysOssService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerServiceImpl + * @description + * @create 2024-05-06 18:09 + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserWorkerServiceImpl implements RemoteUserWokerService { + + @Resource + private ISysOssService sysOssService; + + @Override + public byte[] downLoadSigleSfzZip(RemoteUserWorkerZipVo vo) throws Exception { + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + if(StringUtils.isNotEmpty(vo.getCardPositive())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_正面."+StringUtils.getDomainSuffix(vo.getCardPositive())); + ins.add(storage.getObjectContent(vo.getCardPositive())); + } + if(StringUtils.isNotEmpty(vo.getCardBack())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_反面."+StringUtils.getDomainSuffix(vo.getCardBack())); + ins.add(storage.getObjectContent(vo.getCardBack())); + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); + byte[] data = outputStream.toByteArray(); + return data; + } + + @Override + public byte[] downLoadInvZip(List list) throws Exception { + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list) { + if(StringUtils.isNotEmpty(vo.getCardPositive())){ + paths.add("发票编号_"+vo.getInvNo()+StringUtils.getDomainSuffix(vo.getInvPic())); + ins.add(storage.getObjectContent(vo.getInvPic())); + } + } + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); + byte[] data = outputStream.toByteArray(); + return data; + + } + + @Override + public RemoteResultZip createWorkerSfzZip(List list) throws Exception{ + + OssClient storage = OssFactory.instance(); +// String zipId = IdUtil.fastUUID().toString(); +// java.io.File zipFile = new java.io.File(zipId+".zip"); +// InputStream zipInputStream = null; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list) { + try { + if (StringUtils.isNotEmpty(vo.getCardPositive())) { + paths.add(vo.getWorkName() + vo.getWorkId() + "_正面." + StringUtils.getDomainSuffix(vo.getCardPositive())); + ins.add(storage.getObjectContent(vo.getCardPositive())); + } + if (StringUtils.isNotEmpty(vo.getCardBack())) { + paths.add(vo.getWorkName() + vo.getWorkId() + "_反面." + StringUtils.getDomainSuffix(vo.getCardBack())); + ins.add(storage.getObjectContent(vo.getCardBack())); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("生成身份证图片信息失败,自雇者ID{}", vo.getWorkId()); + } + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(fileId); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + + return rrz; + + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + + + /*** + * 合同信息 + * @param list + * @return + * @throws Exception + */ + @Override + public RemoteResultZip createWorkerHtZip(List list) throws Exception { + + OssClient storage = OssFactory.instance(); +// String zipId = IdUtil.fastUUID().toString(); +// java.io.File zipFile = new java.io.File(zipId+".zip"); +// InputStream zipInputStream = null; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list){ + if(StringUtils.isNotEmpty(vo.getHtUrl())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_合同."+StringUtils.getDomainSuffix(vo.getHtUrl())); + ins.add(storage.getObjectContent(vo.getHtUrl())); + } + } + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); +// UploadResult uploadResult = storage.upload(zipInputstream, zipId+".zip", "application/zip"); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(uploadResult.getFilename()); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + return rrz; + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + + @Override + public RemoteResultZip createWorkerPayCerZip(List list) throws Exception { + + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list){ + if(StringUtils.isNotEmpty(vo.getPayReceipt())){ + paths.add(vo.getWorkName()+vo.getBusNo()+"_凭证."+StringUtils.getDomainSuffix(vo.getPayReceipt())); + ins.add(storage.getObjectContent(vo.getPayReceipt())); + } + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); +// UploadResult uploadResult = storage.upload(zipInputstream, zipId+".zip", "application/zip"); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(uploadResult.getFilename()); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + return rrz; + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java new file mode 100644 index 0000000..5f6e3df --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.net.URLEncodeUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.dromara.sms4j.tencent.config.TencentConfig; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 微信服务 + * + * @author Lion Li + */ +@Slf4j +//@RequiredArgsConstructor +@Service +@DubboService +public class RemoteWeiXinServiceImpl implements RemoteWeiXinService { + + @Resource(name="remoteFileServiceImpl") + private RemoteFileService remoteFileService; + + @DubboReference + private RemoteConfigService remoteConfigService; + + @Override + public String genPubAuthQrcode(String domain,String redirectUri) throws ServiceException { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null || StringUtils.isBlank(site.getWxPubConfig())){ + throw new ServiceException("不支持微信登录"); + } + JSONObject weixinConfig = JSONObject.parseObject(site.getWxPubConfig()); + String authUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+weixinConfig.getString("appid")+"&redirect_uri="+ URLEncodeUtil.encodeAll(redirectUri) +"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; + byte[] data = null; + String format = "png"; + try { + Map hints = new HashMap<>(3); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + hints.put(EncodeHintType.MARGIN, 0); + + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(authUrl, BarcodeFormat.QR_CODE, 300, 300,hints); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, format, outStream); + data = outStream.toByteArray(); + } catch (WriterException e) { + throw new ServiceException("二维码生成失败"); + } catch (IOException e) { + throw new ServiceException("二维码生成失败"); + } + String fileName = UUID.fastUUID().toString() + "." + format; + RemoteFile oss = remoteFileService.upload(fileName, fileName, "image/png", data); + return oss.getUrl(); + } + + @Override + public String getOpenId(String domain, String code) { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null || StringUtils.isBlank(site.getWxPubConfig())){ + throw new ServiceException("不支持微信登录"); + } + try { + JSONObject weixinConfig = JSONObject.parseObject(site.getWxPubConfig()); + String json = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+weixinConfig.getString("appid")+"&secret="+weixinConfig.getString("appkey")+"&code="+code+"&grant_type=authorization_code", StandardCharsets.UTF_8); + log.info("获取授权用户的微信openid:("+weixinConfig.getString("appid")+")"+json); + JSONObject rtn = JSONObject.parseObject(json); + if(rtn.containsKey("openid")){ + return rtn.getString("openid"); + } + } catch (Exception e) { + log.error("获取授权用户的微信openid出错:("+domain+","+code+")",e); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java new file mode 100644 index 0000000..e77351e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java @@ -0,0 +1,183 @@ +package org.dromara.resource.junziqian.common; + +import org.apache.commons.lang3.StringUtils; + + +/** + * 基本工具类 + * @author yfx + * + */ +public abstract class CommonUtil { + + /** + * 去空,null->'' + * + * @param str + * @return + */ + public static String trim(String str, String def) { + if (str == null || "null".equals(str.trim()) || "".equals(str.trim())) { + return def; + } else { + return str.trim(); + } + } + + /** + * 去空,null->'' + * + * @param str + * @return + */ + public static String trim(String str) { + if (str == null || "null".equals(str.trim())) { + return ""; + } else { + return str.trim(); + } + } + + /** + * 去空,支持sql(发现为空时返回null) + * + * @param str + * @return + */ + public static String trimForSql(String str) { + if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) { + return null; + } else { + return str.trim(); + } + } + + /** + * 默认转换 + * + * @param obj + * @param cla + * @return + */ + @SuppressWarnings("unchecked") + public static T parVal(Object obj, Class cla) { + if (cla.equals(String.class)) { + if (obj == null || "".equals(obj + "") || "null".equals(obj)) { + return (T) ""; + } else { + return (T) (obj + ""); + } + } else { + try { + if (obj == null) + return null; + if (cla.equals(Integer.class)) + return (T) Integer.valueOf(obj + ""); + if (cla.equals(Long.class)) + return (T) Long.valueOf(obj + ""); + if (cla.equals(Float.class)) + return (T) Float.valueOf(obj + ""); + if (cla.equals(Double.class)) + return (T) Double.valueOf(obj + ""); + if (cla.equals(Boolean.class)) + return (T) Boolean.valueOf(obj + ""); + return (T) obj; + } catch (Exception e) { + throw new RuntimeException("CommonUtil.parVal error|obj:" + obj+ ",class:" + cla); + } + } + } + + /** + * 不返回错误的转换 + * + * @param obj + * @param cla + * @return + */ + public static T parValNoErr(Object obj, Class cla) { + try { + return parVal(obj, cla); + } catch (Exception e) { + return null; + } + } + + /** + * 不返回错误的转换,为空或异常时返回默认值 + * @param obj + * @param cla + * @param t + * @return + */ + public static T parValNoErrDef(Object obj, Class cla, T t) { + try { + T t1 = parVal(obj, cla); + if (t1 == null || (cla.equals(String.class) && "".equals(t1))) { + return t; + } + return t1; + } catch (Exception e) { + return t; + } + } + + /** + * 补位数据 ,前补0 + * @param src + * @param length + * @return + */ + public static String conver0(Object src, int length) { + if(src instanceof Number){ + return String.format("%0"+length+"d",src); + }else if(src instanceof String){ + String str1=((String)src); + if(str1.length()num) { + start = str.substring(0, a); + end = str.substring(length-b); + le = length-num; + } + for (int i = 0; i < le; i++) { + temp+="*"; + } + return start+temp+end; + } + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java new file mode 100644 index 0000000..fae5119 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java @@ -0,0 +1,614 @@ +package org.dromara.resource.junziqian.common; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.junziqian.common.http.HttpClientUtils; +import org.junit.Assert; +import org.junit.Before; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Base64; +import java.util.IdentityHashMap; +import java.util.Map; +@Slf4j +@Component +public class JzqUtils { + @Value("${junziqian.Services_URL}") + private String servicesUrl; + + @Value("${junziqian.AppSecret}") + private String appSecret; + + @Value("${junziqian.AppKey}") + private String appKey; + //请求的body内参数 + Map bodyParams; + + @Before + public void initParams() { + Assert.assertTrue("APP_KEY不能为空", StringUtils.isNotBlank(appKey)); + Assert.assertTrue("APP_SECRET不能为空", StringUtils.isNotBlank(appSecret)); + log.warn("测试前请确认APP_KEY,APP_SECRET,LOCAL_URL等配置是否正确"); + log.info("APP_KEY:" + appKey); + log.info("APP_SECRET:" + appSecret); + log.info("SERVICE_URL:" + servicesUrl); + long ts = System.currentTimeMillis(); + String nonce = DigestUtils.md5Hex(System.currentTimeMillis() + ""); + String sign = DigestUtils.sha256Hex("nonce" + nonce + "ts" + ts + "app_key" + appKey + "app_secret" + appSecret); + bodyParams = new IdentityHashMap<>(); + bodyParams.put("ts", ts); + bodyParams.put("app_key", appKey); + bodyParams.put("sign", sign); + bodyParams.put("nonce", nonce);//这只只是为了生成一个随机值 + } + + //个人信息二要素校验 + public String userValid(String name ,String identityCard){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/userValid"; + params.put("name",name); + params.put("identityCard",identityCard); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //身份证识别 + public String ocrIdentity(String file, Integer front){ + initParams(); + // 将文件对象放入参数中 + Map params = bodyParams; + // 解码 Base64 字符串为字节数组 + byte[] fileBytes = Base64.getDecoder().decode(file); + + // 创建临时文件 + File tempFile = null; + try { + Path tempFilePath = Files.createTempFile("ocrIdentity", ".jpg"); + tempFile = tempFilePath.toFile(); + + // 将字节数组写入临时文件 + try (FileOutputStream fos = new FileOutputStream(tempFile)) { + fos.write(fileBytes); + } + + + + String url = servicesUrl + "/v2/ocr/ocrIdentity"; + + + params.put("file", tempFile); + params.put("front", front); + + // 发送 HTTP 请求 + return HttpClientUtils.init().getPost(url, null, params, true); + } catch (IOException e) { + log.error("文件处理失败: " + e.getMessage(), e); + throw new RuntimeException("文件处理失败", e); + } finally { + // 删除临时文件 + if (tempFile != null && tempFile.exists()) { + tempFile.delete(); + } + } + } + + //银行卡识别 + public String ocrBank(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrBank"; + params.put("file",file); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //营业执照识别 + public ResultInfo ocrBusinessLic(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrBusinessLic"; + params.put("file",file); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //H5人脸识别 + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + initParams(); + log.info("startH5Face:"+orderNo+","+name+","+identityCard+","+backUrl+","+startFrom+"$$$$$$$$$$$$$"); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/startH5Face"; + params.put("orderNo",orderNo); + params.put("name",name); + params.put("identityCard",identityCard); + params.put("backUrl",backUrl); + params.put("startFrom",startFrom); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //银行三要素认证 + public String bankThreeVerify(String name ,String identityCard,String cardNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/bankThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("cardNo",cardNo); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //银行四要素认证 + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/bankThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("cardNo",cardNo); + params.put("mobilePhone",mobilePhone); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //运营商三要素校验 + public ResultInfo operatorsThreeVerify(String name ,String identityCard,String mobile){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/operatorsThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("mobile",mobile); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业基本信息核验 + public ResultInfo enterpriseInfoMatch(String enterpriseName,String identityNo,String legalPersonName){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/enterpriseInfoMatch"; + params.put("enterpriseName",enterpriseName); + params.put("identityNo",identityNo); + params.put("legalPersonName",legalPersonName); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业工商四要素核验 + public ResultInfo entFourVerify(String entName,String bizLic,String name,String identityCard){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/entFourVerify"; + params.put("entName",entName); + params.put("bizLic",bizLic); + params.put("name",name); + params.put("identityCard",identityCard); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //手写对比度 + public ResultInfo ocrPic(String file,String text){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrPic"; + params.put("file",file); + if (!ObjectUtils.isEmpty(text)){ + params.put("text",text); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //获取签约链接 + public String link(String applyNo,String fullName,String identityCard,int identityType){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/link"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //获取签约链接(短连接) + public ResultInfo linkNew(String applyNo,String fullName,String identityCard,int identityType,int viewMode,int useCustomDomain,String backUrl){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/linkNew"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + if (!ObjectUtils.isEmpty(viewMode)){ + params.put("viewMode",viewMode); + } + if (!ObjectUtils.isEmpty(useCustomDomain)){ + params.put("useCustomDomain",useCustomDomain); + } + if (!ObjectUtils.isEmpty(backUrl)){ + params.put("backUrl",backUrl); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //短信验证码 + public ResultInfo smsVerify(String target){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrPic"; + params.put("target",target); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业实名认证上传 + public ResultInfo organizationCreate(String emailOrMobile, String name, int organizationType, int identificationType, + String organizationRegNo, String organizationRegImg, String legalName, + String legalIdentityCard, String legalMobile, String legalIdentityFrontImg, + String legalIdentityBackImg, String signImg, String address, String authorizeName, + String authorizeCard, String authorizeMobilePhone, String organizationCode, + String organizationCodeImg, String taxCertificateImg, String signApplication, + String notifyUrl){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationCreate"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + if(!ObjectUtils.isEmpty(legalIdentityCard)){ + params.put("legalIdentityCard",legalIdentityCard); + } + if(!ObjectUtils.isEmpty(legalMobile)){ + params.put("legalMobile",legalMobile); + } + if(!ObjectUtils.isEmpty(legalIdentityFrontImg)){ + params.put("legalIdentityFrontImg",legalIdentityFrontImg); + } + if(!ObjectUtils.isEmpty(legalIdentityBackImg)){ + params.put("legalIdentityBackImg",legalIdentityBackImg); + } + if(!ObjectUtils.isEmpty(signImg)){ + params.put("signImg",signImg); + } + if(!ObjectUtils.isEmpty(address)){ + params.put("address",address); + } + if(!ObjectUtils.isEmpty(authorizeName)){ + params.put("authorizeName",authorizeName); + } + if(!ObjectUtils.isEmpty(authorizeCard)){ + params.put("authorizeCard",authorizeCard); + } + if(!ObjectUtils.isEmpty(authorizeMobilePhone)){ + params.put("authorizeMobilePhone",authorizeMobilePhone); + } + if(!ObjectUtils.isEmpty(organizationCode)){ + params.put("organizationCode",organizationCode); + } + if(!ObjectUtils.isEmpty(organizationCodeImg)){ + params.put("organizationCodeImg",organizationCodeImg); + } + if(!ObjectUtils.isEmpty(taxCertificateImg)){ + params.put("taxCertificateImg",taxCertificateImg); + } + if(!ObjectUtils.isEmpty(signApplication)){ + params.put("signApplication",signApplication); + } + if (!ObjectUtils.isEmpty(notifyUrl)){ + params.put("notifyUrl",notifyUrl); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业实名认证重传 + public ResultInfo organizationReapply(String emailOrMobile, String name, int organizationType, int identificationType, + String organizationRegNo, byte[] organizationRegImg, String legalName, + String legalIdentityCard, String legalMobile, byte[] legalIdentityFrontImg, + byte[] legalIdentityBackImg, byte[] signImg, String address, + String authorizeName, String authorizeCard, String authorizeMobilePhone, + String organizationCode, byte[] organizationCodeImg, byte[] taxCertificateImg, + byte[] signApplication){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationReapply"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + if(!ObjectUtils.isEmpty(legalIdentityCard)){ + params.put("legalIdentityCard",legalIdentityCard); + } + if(!ObjectUtils.isEmpty(legalMobile)){ + params.put("legalMobile",legalMobile); + } + if(!ObjectUtils.isEmpty(legalIdentityFrontImg)){ + params.put("legalIdentityFrontImg",legalIdentityFrontImg); + } + if(!ObjectUtils.isEmpty(legalIdentityBackImg)){ + params.put("legalIdentityBackImg",legalIdentityBackImg); + } + if(!ObjectUtils.isEmpty(signImg)){ + params.put("signImg",signImg); + } + if(!ObjectUtils.isEmpty(address)){ + params.put("address",address); + } + if(!ObjectUtils.isEmpty(authorizeName)){ + params.put("authorizeName",authorizeName); + } + if(!ObjectUtils.isEmpty(authorizeCard)){ + params.put("authorizeCard",authorizeCard); + } + if(!ObjectUtils.isEmpty(authorizeMobilePhone)){ + params.put("authorizeMobilePhone",authorizeMobilePhone); + } + if(!ObjectUtils.isEmpty(organizationCode)){ + params.put("organizationCode",organizationCode); + } + if(!ObjectUtils.isEmpty(organizationCodeImg)){ + params.put("organizationCodeImg",organizationCodeImg); + } + if(!ObjectUtils.isEmpty(taxCertificateImg)){ + params.put("taxCertificateImg",taxCertificateImg); + } + if(!ObjectUtils.isEmpty(signApplication)){ + params.put("signApplication",signApplication); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + + } + //SaaS_API发起 文件上传 + public ResultInfo link(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/link"; + params.put("file",file); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //SaaS_API 文件发起 + public ResultInfo link(File file,File attachFile,String backUrl,JSONArray signatories){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/link"; + params.put("file",file); + if(ObjectUtils.isEmpty(attachFile)){ + params.put("attachFile",attachFile); + } + if(!ObjectUtils.isEmpty(backUrl)){ + params.put("backUrl",backUrl); + } + if(!ObjectUtils.isEmpty(signatories)){ + params.put("signatories",signatories); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //获取合同编号 + public ResultInfo applyNo(String fileKey){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/applyNo"; + params.put("fileKey",fileKey); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //SaaS文件下载 + public ResultInfo link(String fileKey,String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/download/link"; + params.put("fileKey",fileKey); + params.put("applyNo",applyNo); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //发送签约提醒 + public ResultInfo sendSigningReminder(String applyNo,String businessNo,String fullName,String identityCard,int idenntityType,int signNotifyType,String customizeName){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/notify"; + params.put("applyNo",applyNo); + params.put("businessNo",businessNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("idenntityType",idenntityType); + params.put("signNotifyType",signNotifyType); + if(!ObjectUtils.isEmpty(customizeName)){ + params.put("customizeName",customizeName); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + // 签约发起-模板类API + public String applySign(JzqSign request) { + initParams(); + Map params = bodyParams; + + + + String url = servicesUrl + "/v2/sign/applySign"; + params.put("contractName", request.getContractName()); + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(request.getSignatories().get(0)); + jsonArray.add(request.getSignatories().get(1)); + + params.put("signatories", jsonArray.toString()); + params.put("serverCa", request.getServerCa()); + params.put("dealType", request.getDealType()); + params.put("templateNo", request.getTemplateNo()); + if (!ObjectUtils.isEmpty(request.getTemplateParams())) { + params.put("templateParams", request.getTemplateParams()); + } + params.put("fileType", request.getFileType()); + if (!ObjectUtils.isEmpty(request.getAddPage())) { + params.put("addPage", request.getAddPage()); + } + if (!ObjectUtils.isEmpty(request.getPositionType())) { + params.put("positionType", request.getPositionType()); + } + if (!ObjectUtils.isEmpty(request.getFaceThreshold())) { + params.put("faceThreshold", request.getFaceThreshold()); + } +// if (!ObjectUtils.isEmpty(request.getOrderFlag())) { +// params.put("orderFlag", request.getOrderFlag()); +// } +// if (!ObjectUtils.isEmpty(request.getSequenceInfo())) { +// params.put("sequenceInfo", request.getSequenceInfo()); +// } + if (!ObjectUtils.isEmpty(request.getNotifyUrl())) { + params.put("notifyUrl", request.getNotifyUrl()); + } +// if (!ObjectUtils.isEmpty(request.getNoEbqSign())) { +// params.put("noEbqSign", request.getNoEbqSign()); +// } +// if (!ObjectUtils.isEmpty(request.getAttachFiles())) { +// params.put("attachFiles", request.getAttachFiles()); +// } +// if (!ObjectUtils.isEmpty(request.getNeedQifengSign())) { +// params.put("needQifengSign", request.getNeedQifengSign()); +// } +// if (!ObjectUtils.isEmpty(request.getNoBorderSign())) { +// params.put("noBorderSign", request.getNoBorderSign()); +// } + + return HttpClientUtils.init().getPost(url, null, params, true); + } + //撤销签约合同 + public ResultInfo cancel(String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/cancel"; + params.put("applyNo",applyNo); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //撤销批量签约发起 + public ResultInfo batchSignCancel(String businessNo,int part,String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/batchSignCancel"; + params.put("businessNo",businessNo); + if(!ObjectUtils.isEmpty(part)){ + params.put("part",part); + } + if(!ObjectUtils.isEmpty(applyNo)){ + params.put("applyNo",applyNo); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //签约状态查询 + public ResultInfo status(String applyNo,String fullName,String identityCard,String identityType){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/status"; + params.put("applyNo",applyNo); + if(!ObjectUtils.isEmpty(fullName)){ + params.put("fullName",fullName); + } + if(!ObjectUtils.isEmpty(identityCard)){ + params.put("identityCard",identityCard); + } + if(!ObjectUtils.isEmpty(identityType)){ + params.put("identityType",identityType); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //签约状态及时间查询 + public ResultInfo info(String applyNo,String fullName,String identityCard,int identityType,Integer showAll){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/info"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + if(!ObjectUtils.isEmpty(showAll)){ + params.put("showAll",showAll); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //创建或修改合同模板 + public ResultInfo oper(Long templateId){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/tmpl/oper"; + params.put("templateId",templateId); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业认证实名上传 + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationCreate"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + params.put("legalIdentityCard",legalIdentityCard); + params.put("legalMobile",legalMobile); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //个人证书申请资料上传 + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + + log.info(idenFront.toString()); + + + + + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/cloudCertiPerInfo"; + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("idenFront",idenFront); + params.put("idenReverse",idenReverse); + return HttpClientUtils.init().getPost(url,null,params,true); + + } + + + //文件下载 + public String linkFile(String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/linkFile"; + params.put("applyNo",applyNo); + return HttpClientUtils.init().getPost(url,null,params,true); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java new file mode 100644 index 0000000..349bc11 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java @@ -0,0 +1,93 @@ +package org.dromara.resource.junziqian.common; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.io.Serializable; + +/** + * 返回对象 + * @author luopeng + * + */ +@Data +public class ResultInfo implements Serializable { + + private static final long serialVersionUID = -1L; + + private boolean success; // 操作是否成功 + private String msg; // 操作失败的原因 + + private String resultCode;//返回码 + + private T data;//返回对象 + + /**异常对象不作序列化传输*/ + private transient Exception exception;//异常对象 + + public ResultInfo(){} + + public static ResultInfo create(Class cls){ + return new ResultInfo(); + } + + public static ResultInfo create(){ + return new ResultInfo(); + } + + public static ResultInfo createFail(Exception e){ + ResultInfo result = new ResultInfo(); + result.fail(e); + return result; + } + + public static ResultInfo createFail(String msg,Exception e){ + ResultInfo result = new ResultInfo(); + result.fail(msg,e); + return result; + } + + public ResultInfo success(){ + this.success = true; + return this; + } + + public ResultInfo success(T data){ + this.success = true; + this.data = data; + return this; + } + + public ResultInfo fail(){ + this.success = false; + return this; + } + + public ResultInfo fail(String msg){ + this.success = false; + this.msg = msg; + return this; + } + + public ResultInfo fail(Exception e){ + this.success = false; + if(e != null){ + this.exception = e; + this.msg = e.getMessage(); + } + return this; + } + + public ResultInfo fail(String msg,Exception e){ + this.success = false; + this.msg = msg; + if(e != null){ + this.exception = e; + } + return this; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java new file mode 100644 index 0000000..0b9e7c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java @@ -0,0 +1,43 @@ +package org.dromara.resource.junziqian.common.bean.sign; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class JzqBack implements Serializable { + + /** + * 签约编号 + */ + private String applyNo; + + /** + * 证件类型 + * 1: 身份证, 2: 护照, 3: 台胞证, 4: 港澳居民来往内地通行证, 11: 营业执照, 12: 统一社会信用代码, 99: 其他 + */ + private int identityType; + + /** + * 名称 + */ + private String fullName; + + /** + * 证件号 + */ + private String identityCard; + + /** + * 操作时间(毫秒) + */ + private long optTime; + + /** + * 签约状态 + * 1: 签约完成, 2: 拒签, 3: 已保全 + */ + private int signStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java new file mode 100644 index 0000000..87ca9cb --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java @@ -0,0 +1,96 @@ +package org.dromara.resource.junziqian.common.bean.sign; + +import lombok.Data; +import org.dromara.resource.api.domain.SignatoryReq; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +public class JzqSign implements Serializable { + /** + * 合同名称,非空,最长100个字符 + */ + private String contractName; + + /** + * 签约方,参考后面签约方说明 + */ + private List signatories; + + /** + * 是否需要服务端云证书:非1不需要(默认);1需要;建议需要,否则影响后续司法服务 + */ + private Integer serverCa; + + /** + * 处理方式:为空或0时默认为手签合同(用户有感知);2只保全;5部份自动签;6HASH只保全;17收集信息批量签 + */ + private Integer dealType; + + /** + * 合同模版编号, fileType=2或4, 时必须传入 + */ + private String templateNo; + + /** + * 合同模版参数JSON字符串, fileType=2或4, 时必须传入 + */ + private String templateParams; + + /** + * 2 API模版(HTML源码); 4 API模板(PDF文件/word文件) + */ + private Integer fileType; + + /** + * ofd文件追加内容(0不能追加内容,1允许追加内容),允许追加内容时noEbqSign需要设置为2 + */ + private Integer addPage; + + /** + * 指定公章位置类型: 0或null使用签字座标位置或不指定签字位置; 1表单域定位(表单域如果上传为pdf时,需pdf自行定义好表单域); 2关键字定义 + */ + private Integer positionType; + + /** + * 验证方式为人脸时必传, 人脸识别阀值: 默认等级(1-100之间整数),建议大于72, 验证方式在签约方中(signatories)设置 + */ + private Integer faceThreshold; + +// /** +// * 是否按顺序签字,非1为不按,1为按 +// */ +// private Integer orderFlag; +// +// /** +// * 多合同顺序签约或批量签合同关联信息,参考后面表格说明 +// */ +// private Map sequenceInfo; +// + /** + * 合同签署完成后异步通知地址 + */ + private String notifyUrl; +// +// /** +// * 不显示ebq的保全章: 1不显示但会签名, 2不显示也不签名; 0或其它-显示 +// */ +// private Integer noEbqSign; +// +// /** +// * 合同附件, 虽不限个数, 但包括合同原文件, 不能超过30MB, *SDK引用中的多文件同名情况的上传说明 +// */ +// private String[] attachFiles; +// +// /** +// * 是否使用骑缝章: 1使用; 2个人不要企业要,3个人要企业不要 +// */ +// private Integer needQifengSign; +// +// /** +// * 是否不显示个人标准章边框: 1不显示;0显示边框(默认);2不显示边框标准章字体为黑 +// */ +// private Integer noBorderSign; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java new file mode 100644 index 0000000..de95e27 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java @@ -0,0 +1,36 @@ +package org.dromara.resource.junziqian.common.exception; + +/** + * @Description: 返回的异常信息处理 + * @author yfx + * @date 2015年9月10日 上午9:32:12 + */ +public class ResultInfoException extends RuntimeException{ + + private static final long serialVersionUID = -962336849220646170L; + + private String resultCode; + + public ResultInfoException() { + super(); + } + + public ResultInfoException(String resultCode,String message) { + super(message); + this.resultCode=resultCode; + } + + public ResultInfoException(String resultCode,String message, Throwable cause) { + super(message, cause); + this.resultCode=resultCode; + } + + public ResultInfoException(String message, Throwable cause) { + super(message, cause); + } + + public String getResultCode() { + return resultCode; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java new file mode 100644 index 0000000..393d5e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java @@ -0,0 +1,479 @@ +package org.dromara.resource.junziqian.common.http; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.*; +import org.apache.http.client.HttpRequestRetryHandler; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.config.ConnectionConfig; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.ByteArrayBody; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.entity.mime.content.InputStreamBody; +import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.LaxRedirectStrategy; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.ExecutionContext; +import org.apache.http.protocol.HttpContext; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; +import org.dromara.resource.junziqian.common.CommonUtil; +import org.dromara.resource.junziqian.common.ResultInfo; +import org.dromara.resource.junziqian.common.exception.ResultInfoException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLException; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.File; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.io.UnsupportedEncodingException; +import java.net.ConnectException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.nio.charset.CodingErrorAction; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * http的请求服务类 + * 也可以考虑使用spring restTemplate调用 + */ +@Component +public class HttpClientUtils { + public static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); + private static Object objTg = new Object(); + private static HttpClientUtils httpClientUtils; + /** + * 默认连接超时时间 + */ + private final static int DEFAULT_CONN_TIMEOUT = 6000; + /**最大重试次数*/ + private final static int DEFAULT_RETRY_TIMES = 3; + + private CloseableHttpClient client; + + /** + * ssl trust管理 + */ + public static class SSLTrustAllManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + + /** + * 初始化ssl管理 + * @return + * @throws KeyStoreException + * @throws CertificateException + * @throws NoSuchAlgorithmException + * @throws IOException + * @throws KeyManagementException + */ + private SSLConnectionSocketFactory initSSLConnectionSocketFactory() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, KeyManagementException { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + SSLContext sslcontext = SSLContexts.custom() + .loadTrustMaterial(trustStore, + new TrustSelfSignedStrategy()) + .build(); + sslcontext.init(null, new TrustManager[] { new SSLTrustAllManager() }, null); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + sslcontext, + //new String[] { "TLSv1","TLSv1.1","TLSv1.2","SSLv3"},//参考ProtocolVersion//这里写为null为所有 + null, + null, + SSLConnectionSocketFactory.getDefaultHostnameVerifier()); + return sslsf; + } + + + public HttpClientUtils() throws Exception { + // 设置协议http和https对应的处理socket链接工厂的对象 + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", initSSLConnectionSocketFactory()) + .build(); + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + connManager.setValidateAfterInactivity(1000); + ConnectionConfig connectionConfig = ConnectionConfig.custom() + .setMalformedInputAction(CodingErrorAction.IGNORE) + .setUnmappableInputAction(CodingErrorAction.IGNORE) + .setCharset(Consts.UTF_8) + .build(); + connManager.setDefaultConnectionConfig(connectionConfig); + connManager.setMaxTotal(100); + connManager.setDefaultMaxPerRoute(10);//最大路由深度,即301次数 + + //默认头信息,创建自定义的httpclient对象 + List
defaultHeaders=new ArrayList
(); + defaultHeaders.add(new BasicHeader("Accept","text/html,application/xhtml+xml,application/xml,application/json;q=0.9,*/*;q=0.8")); + defaultHeaders.add(new BasicHeader("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")); + defaultHeaders.add(new BasicHeader("Connection","close")); + defaultHeaders.add(new BasicHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0")); + //默认请求配置 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(DEFAULT_CONN_TIMEOUT) + .setConnectTimeout(DEFAULT_CONN_TIMEOUT) + //.setProxy(new HttpHost("myotherproxy", 8080)) //设置代理 + .setConnectionRequestTimeout(DEFAULT_CONN_TIMEOUT).build(); + //重试拦截 + HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { + @Override + public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { + if (executionCount >= DEFAULT_RETRY_TIMES) { + //Do not retry if over max retry count + return false; + } + if (exception instanceof InterruptedIOException) { + // Timeout + return false; + } + if (exception instanceof UnknownHostException) { + // Unknown host + return false; + } + if (exception instanceof ConnectException) { + // Connection refused + return false; + } + if (exception instanceof SSLException) { + // SSL handshake exception + return false; + } + HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); + boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); + if (idempotent) { + return true; + } + return false; + } + }; + + client = HttpClients.custom() + .setConnectionManager(connManager) + .setDefaultHeaders(defaultHeaders) + .setDefaultRequestConfig(requestConfig) + .setRetryHandler(myRetryHandler) + .setRedirectStrategy(new LaxRedirectStrategy()) + .build(); + } + /** + * init实例 + * @return + */ + public static HttpClientUtils init(){ + synchronized (objTg) { + if (httpClientUtils == null) { + try { + httpClientUtils = new HttpClientUtils(); + } catch (Exception e) { + throw new ResultInfoException("ACCESS_SIGN_ERROR","httpClient初始化出错",e); + } + } + } + return httpClientUtils; + } + + + /** + * 工具类,通过url和params 生成url地址 + * @param url + * @param params + * @return + * @throws URISyntaxException + */ + public static URI builderUrl(String url, Map params){ + URIBuilder builder = null; + try { + builder = new URIBuilder(url); + if(params!=null&¶ms.size()>0){ + for(String key: params.keySet()){ + Object obj=params.get(key); + if(obj==null){continue;} + builder.setParameter(key, CommonUtil.parValNoErr(obj, String.class)); + } + } + return builder.build(); + } catch (URISyntaxException e) { + throw new ResultInfoException("HTTP_URL_FORMART","转换地址出错:"+url,e); + } + } + + public static void fillHeader(HttpRequestBase request, Map heads){ + //请求头 + if (heads != null && heads.size() > 0) { + for (String key : heads.keySet()) { + request.addHeader(key, heads.get(key) + ""); + } + } + } + /** + * get请求 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public String getGet(String uri, Map heads, Map params) { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + return result; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result)?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("EXCEPTION","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + public byte[] getGetByte(String uri, Map heads, Map params) { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + byte[] result = EntityUtils.toByteArray(response.getEntity()); + return result; + } else { + ResultInfo res=new ResultInfo(); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("EXCEPTION","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * 直接获取返回体,注意要手动关闭response + * @param uri + * @param heads + * @param params + * @return + */ + public CloseableHttpResponse getGetResponse(String uri, Map heads, Map params) throws IOException { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + response = client.execute(request); + return response; + } + + /** + * 构建post的body信息, + * @param request + * @param params + * @param ifMutipart 是否启用富文件方式上传 + */ + private void buildPostBody(HttpPost request, Map params, boolean ifMutipart){ + if(ifMutipart){ + //富文本请求 + MultipartEntityBuilder meBuiler = MultipartEntityBuilder.create(); + if (params != null && params.size() > 0) { + for (String key : params.keySet()) { + Object obj = params.get(key); + if(obj==null){ + continue; + }else if (obj instanceof File) { + FileBody fb = new FileBody((File) obj); + meBuiler.addPart(key, fb); + } else if (obj instanceof ByteArrayBody) { + meBuiler.addPart(key, (ByteArrayBody) obj); + } else if (obj instanceof FileBody) { + meBuiler.addPart(key, (FileBody) obj); + } else if (obj instanceof InputStreamBody) { + meBuiler.addPart(key, (InputStreamBody) obj); + }else { + StringBody sb = new StringBody(CommonUtil.parValNoErrDef(obj, String.class, ""), ContentType.create("text/plain", "UTF-8")); + meBuiler.addPart(key, sb); + } + } + } + HttpEntity httpEntity = meBuiler.build(); + request.setEntity(httpEntity); + }else{ + //普通请求 + List pList = new ArrayList(); + if (params != null && params.size() > 0) { + for (String key : params.keySet()) { + Object obj=params.get(key); + if(obj==null){continue;} + pList.add(new BasicNameValuePair(key, obj + "")); + } + } + try { + request.setEntity(new UrlEncodedFormEntity(pList, "UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new ResultInfoException("HTTP_REQ_ENCODE_ERROR","请求参数格式化出错",e); + } + } + } + + /** + * post的上传请求 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public String getPost(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + return result; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result) ?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * post的上传请求,返回byte[] + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public byte[] getPostByte(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的byte[] + byte[] result = EntityUtils.toByteArray(response.getEntity()); + return result; + } else { + ResultInfo res=new ResultInfo(); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * post的上传请求,返回CloseableHttpResponse,必须手动关闭 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public CloseableHttpResponse getPostResponse(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + return response; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result)?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java new file mode 100644 index 0000000..ea2e0df --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java @@ -0,0 +1,137 @@ +package org.dromara.resource.junziqian.openai; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +@Service +public class ChatGPTUtils +{ + private static final Logger log; + static String baseUrl; + static String key; + + public static void main(final String[] args) throws Exception { + final ChatGPTUtils chatGPTUtils = new ChatGPTUtils(); + final String q1 = "中国的个人所得税征收标准是什么"; + final ChatResponse response1 = chatGPTUtils.chat("123", "你是一个智能助手", "", "", q1); + final String assistantPreContent = response1.getContent(); + final String q2 = "起征点是多少"; + final ChatResponse response2 = chatGPTUtils.chat("123", "你是一个智能助手", q1, assistantPreContent, q2); + System.out.println(response2); + } + + public ChatResponse chat(final String user, final String systemContent, final String userPreContent, final String assistantPreContent, final String userContent) { + final ChatResponse response = new ChatResponse(); + final String modelId = "gpt-4-1106-preview"; + final String apiUrl = ChatGPTUtils.baseUrl + "/v1/chat/completions"; + final JSONObject data = new JSONObject(); + data.set("user", (Object)user); + data.set("model", (Object)modelId); + final ChatMessage chatMessage = new ChatMessage(); + final JSONArray messages = chatMessage.buildMessage(systemContent, userPreContent, assistantPreContent, "", userContent); + data.set("messages", (Object)messages); + data.set("max_tokens", (Object)4096); + final JSONObject result = this.sendPost(apiUrl, data.toString()); + if (!result.containsKey((Object)"error")) { + response.setContent(result.getStr("content")); + } + else { + response.setError(result.getStr("error")); + } + return response; + } + + public ChatResponse vision(final String user, final String systemContent, final String imageUrl, final String userContent) { + final ChatResponse response = new ChatResponse(); + final String modelId = "gpt-4-vision-preview"; + final String apiUrl = ChatGPTUtils.baseUrl + "/v1/chat/completions"; + final JSONObject data = new JSONObject(); + data.set("user", (Object)user); + data.set("model", (Object)modelId); + final ChatMessage chatMessage = new ChatMessage(); + final JSONArray messages = chatMessage.buildMessage(systemContent, "", "", imageUrl, userContent); + data.set("messages", (Object)messages); + data.set("max_tokens", (Object)4096); + final JSONObject result = this.sendPost(apiUrl, data.toString()); + if (!result.containsKey((Object)"error")) { + response.setContent(result.getStr("content")); + } + else { + response.setError(result.getStr("error")); + } + return response; + } + + private JSONObject sendPost(final String apiUrl, final String data) { + final JSONObject resultJSON = new JSONObject(); + String result = ""; + try { + final URL url = new URL(apiUrl); + final HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Authorization", "Bearer " + ChatGPTUtils.key); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + connection.setDoOutput(true); + try (final DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + ChatGPTUtils.log.info("postData:" + data); + outputStream.write(data.getBytes()); + outputStream.flush(); + } + final int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + final StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + ChatGPTUtils.log.info("ChatGPT 响应:" + response.toString()); + result = response.toString(); + } + } + else { + ChatGPTUtils.log.info("ChatGPT 请求失败,响应码: " + responseCode); + } + connection.disconnect(); + } + catch (Exception e) { + e.printStackTrace(); + ChatGPTUtils.log.error("ChatGPT 网络请求错误", (Throwable)e); + resultJSON.set("error", (Object)"ChatGPT 网络请求错误"); + } + if (StrUtil.isNotBlank((CharSequence)result)) { + final JSONObject jsonObject = JSONUtil.parseObj(result); + final JSONArray choices = jsonObject.getJSONArray("choices"); + final JSONObject error = jsonObject.getJSONObject("error"); + if (choices != null && !jsonObject.containsKey((Object)"error")) { + final JSONObject choice = choices.getJSONObject(0); + final String role = choice.getJSONObject("message").getStr("role"); + final String content = choice.getJSONObject("message").getStr("content"); + resultJSON.set("role", (Object)role); + resultJSON.set("content", (Object)content); + } + else if (error != null) { + resultJSON.set("error", error.get((Object)"message")); + } + } + return resultJSON; + } + + static { + log = LoggerFactory.getLogger((Class)ChatGPTUtils.class); + ChatGPTUtils.baseUrl = "https://flag.smarttrot.com"; + ChatGPTUtils.key = "zk-b02953bb6f9045cf4c683a438350e8fb"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java new file mode 100644 index 0000000..4807b33 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java @@ -0,0 +1,59 @@ +package org.dromara.resource.junziqian.openai; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; + +public class ChatMessage +{ + public JSONArray buildMessage(final String systemContent, final String userPreContent, final String assistantPreContent, final String imageUrl, final String... userContent) { + final JSONArray message = new JSONArray(); + final JSONObject system = new JSONObject(); + system.set("role", (Object)"system"); + system.set("content", (Object)systemContent); + message.add((Object)system); + if (StrUtil.isNotBlank((CharSequence)userPreContent)) { + final JSONObject preUser = new JSONObject(); + preUser.set("role", (Object)"user"); + preUser.set("content", (Object)userPreContent); + message.add((Object)preUser); + } + if (StrUtil.isNotBlank((CharSequence)assistantPreContent)) { + final JSONObject assistant = new JSONObject(); + assistant.set("role", (Object)"assistant"); + assistant.set("content", (Object)assistantPreContent); + message.add((Object)assistant); + } + if (StrUtil.isBlank((CharSequence)imageUrl)) { + final JSONObject user = new JSONObject(); + final JSONArray contents = new JSONArray(); + user.set("role", (Object)"user"); + for (final String s : userContent) { + final JSONObject content = new JSONObject(); + content.set("type", (Object)"text"); + content.set("text", (Object)s); + contents.add((Object)content); + } + user.set("content", (Object)contents); + message.add((Object)user); + } + else { + final JSONObject image = new JSONObject(); + image.set("role", (Object)"user"); + final JSONArray imageContentArray = new JSONArray(); + final JSONObject content2 = new JSONObject(); + content2.set("type", (Object)"image_url"); + content2.set("image_url", (Object)imageUrl); + imageContentArray.add((Object)content2); + for (final String s2 : userContent) { + final JSONObject textContent = new JSONObject(); + textContent.set("type", (Object)"text"); + textContent.set("text", (Object)s2); + imageContentArray.add((Object)textContent); + } + image.set("content", (Object)imageContentArray); + message.add((Object)image); + } + return message; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java new file mode 100644 index 0000000..1c79c46 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java @@ -0,0 +1,81 @@ +package org.dromara.resource.junziqian.openai; + +public class ChatResponse +{ + private String content; + private String error; + + public String getContent() { + return this.content; + } + + public String getError() { + return this.error; + } + + public void setContent(final String content) { + this.content = content; + } + + public void setError(final String error) { + this.error = error; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof ChatResponse)) { + return false; + } + final ChatResponse other = (ChatResponse)o; + if (!other.canEqual(this)) { + return false; + } + final Object this$content = this.getContent(); + final Object other$content = other.getContent(); + Label_0065: { + if (this$content == null) { + if (other$content == null) { + break Label_0065; + } + } + else if (this$content.equals(other$content)) { + break Label_0065; + } + return false; + } + final Object this$error = this.getError(); + final Object other$error = other.getError(); + if (this$error == null) { + if (other$error == null) { + return true; + } + } + else if (this$error.equals(other$error)) { + return true; + } + return false; + } + + protected boolean canEqual(final Object other) { + return other instanceof ChatResponse; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $content = this.getContent(); + result = result * 59 + (($content == null) ? 43 : $content.hashCode()); + final Object $error = this.getError(); + result = result * 59 + (($error == null) ? 43 : $error.hashCode()); + return result; + } + + @Override + public String toString() { + return "ChatResponse(content=" + this.getContent() + ", error=" + this.getError() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java new file mode 100644 index 0000000..aad7d40 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java @@ -0,0 +1,17 @@ +package org.dromara.resource.mapper; + + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.resource.domain.SysOssConfig; +import org.dromara.resource.domain.vo.SysOssConfigVo; + +/** + * 对象存储配置Mapper接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface SysOssConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java new file mode 100644 index 0000000..629ad20 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java @@ -0,0 +1,13 @@ +package org.dromara.resource.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.resource.domain.SysOss; +import org.dromara.resource.domain.vo.SysOssVo; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +public interface SysOssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java new file mode 100644 index 0000000..7a77f3e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java @@ -0,0 +1,39 @@ +package org.dromara.resource.mapper; + +import org.dromara.resource.domain.MerTaskEnroll; +import org.dromara.resource.domain.SysSignLog; +import org.dromara.resource.domain.UserWorkAuth; +import org.dromara.resource.domain.UserWorkerBiz; +import org.dromara.resource.domain.vo.SysSignLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 合同签约日志Mapper接口 + * + * @author LionLi + * @date 2024-05-22 + */ +public interface SysSignLogMapper extends BaseMapperPlus { + + int updateSysSignLog(SysSignLog signLog); + + int updateUserWorkerBiz(UserWorkerBiz userWorkerBiz); + + + /*** + * 更新确认单状态 + * @param taskEnroll + * @return + */ + int updateMerTaskEnrollInfo(MerTaskEnroll taskEnroll); + + + /*** + * 授权协议更新 + * @param uwa + * @return + */ + int updateUserWorkerAuth(UserWorkAuth uwa); + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java new file mode 100644 index 0000000..58fc219 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.resource.mapper; + +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 短信Mapper接口 + * + * @author sunzexing + * @date 2024-03-27 + */ +public interface SysSmsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java new file mode 100644 index 0000000..8c7484d --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java @@ -0,0 +1,28 @@ +package org.dromara.resource.runner; + +import org.dromara.resource.service.ISysOssConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * 初始化 system 模块对应业务数据 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Component +public class ResourceApplicationRunner implements ApplicationRunner { + + private final ISysOssConfigService ossConfigService; + + @Override + public void run(ApplicationArguments args) throws Exception { + ossConfigService.init(); + log.info("初始化OSS配置成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java new file mode 100644 index 0000000..96b6e29 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java @@ -0,0 +1,66 @@ +package org.dromara.resource.service; + + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; + +import java.util.Collection; + +/** + * 对象存储配置Service接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface ISysOssConfigService { + + /** + * 初始化OSS配置 + */ + void init(); + + /** + * 查询单个 + */ + SysOssConfigVo queryById(Long ossConfigId); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); + + + /** + * 根据新增业务对象插入对象存储配置 + * + * @param bo 对象存储配置新增业务对象 + * @return + */ + Boolean insertByBo(SysOssConfigBo bo); + + /** + * 根据编辑业务对象修改对象存储配置 + * + * @param bo 对象存储配置编辑业务对象 + * @return + */ + Boolean updateByBo(SysOssConfigBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 启用停用状态 + */ + int updateOssConfigStatus(SysOssConfigBo bo); + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java new file mode 100644 index 0000000..4114202 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java @@ -0,0 +1,42 @@ +package org.dromara.resource.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +/** + * 文件上传 服务层 + * + * @author Lion Li + */ +public interface ISysOssService { + + TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); + + List listByIds(Collection ossIds); + + String selectUrlByIds(String ossIds); + + SysOssVo getById(Long ossId); + + SysOssVo upload(MultipartFile file); + + SysOssVo upload(File file); + + Boolean insertByBo(SysOssBo bo); + + void download(Long ossId, HttpServletResponse response) throws IOException; + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + void downloadByUrl(String url, HttpServletResponse response); +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java new file mode 100644 index 0000000..a339a2e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java @@ -0,0 +1,70 @@ +package org.dromara.resource.service; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.resource.api.domain.TencentSmsConfig; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.resource.domain.bo.SysSmsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 短信Service接口 + * + * @author sunzexing + * @date 2024-03-27 + */ +public interface ISysSmsService { + + /** + * 查询短信 + */ + SysSmsVo queryById(Long id); + + /** + * 查询短信列表 + */ + TableDataInfo queryPageList(SysSmsBo bo, PageQuery pageQuery); + + /** + * 查询短信列表 + */ + List queryList(SysSmsBo bo); + + /** + * 新增短信 + */ + Boolean insertByBo(SysSmsBo bo); + + /** + * 修改短信 + */ + Boolean updateByBo(SysSmsBo bo); + + /** + * 校验并批量删除短信信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 13:44 + * 说明:发送公众号登录验证码 + **/ + + Boolean sendMpSmsCode(String phone); + + + public Boolean sendSmsCode(SmsType smsType, + String phonenumber, + LinkedHashMap param, + Map smsMap); + Boolean sendMpSmsCode(String domain, String phone); +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java new file mode 100644 index 0000000..0f0f1a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java @@ -0,0 +1,304 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.*; +import org.dromara.resource.mapper.SysSignLogMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title DhqSignServiceImpl + * @description 大鸿签签约 + * @create 2024-05-15 14:53 + */ + +@Service +@Slf4j +public class DhqSignServiceImpl { + + + @Resource + public SysSignLogMapper sysSignLogMapper; + + @Resource + public RemoteFileService remoteFileService; + + /*** + * 发起签约 + * @param sign + * @return + * @throws Exception + */ + + + public String becomeSign(DhqSign sign) throws Exception + { +// String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/pro/addContractSign"; + SysSignLog signLog = new SysSignLog(); + String response = null; + try{ + response = callThirdPartyApi(apiUrl, sign,signLog); + log.info("调用大鸿签发起合同返回结果====》"+ response); + }catch (Exception e){ + signLog.setResultException(e.getMessage()); + response = null; + }finally { + this.sysSignLogMapper.insert(signLog); + } + return response; + } + + + public static void main(String[] args) throws Exception{ + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/signTemplateList"; // 替换为实际的API地址 + + + System.out.println(URLUtil.encode(Base64.encode("https://c.woxin666.com/wxre/2024/08/15/74a87e99d4d5485692c8d9eba169f992.pdf"))); + + + +// String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/pro/addContractSign"; + +// Map paraMap = new HashMap(); +// +// paraMap.put("applicationId","2205026100"); +// paraMap.put("businessId","95d6eb9ae14b4b6f8770467a37132c82"); +// paraMap.put("contractName","测试合同"); +// paraMap.put("launchType",1); +// paraMap.put("launchName","陈总"); +// paraMap.put("launchSubject","15981832653"); +// paraMap.put("launchEnterpriseName","上海欣度网络科技有限公司"); +// paraMap.put("customerOriginationNumber","159818326531231"); +// paraMap.put("contractModelNum","2024081415531723622014701172"); +// paraMap.put("signatureType",0); +// +// //签署文本控件 +// List mapList=new ArrayList<>(); +// Map map2 = new HashMap(); +// map2.put("controlNumber","76505d7668304283aa727d40809f20f7"); +// map2.put("writeContent","20248088"); +// Map map1 = new HashMap(); +// map1.put("controlNumber","2bd867b199b4426e986faeb6508fb3d0"); +// map1.put("writeContent","郑州限公司"); +// Map map3 = new HashMap(); +// map3.put("controlNumber","495e5b2ac1614ed9a08375187cd67888"); +// map3.put("writeContent","张"); +// +// mapList.add(map2); +// mapList.add(map1); +// mapList.add(map3); +// +// paraMap.put("inputValues",mapList); +// +// List> data=new ArrayList<>(); +// Map map = new HashMap<>(); +// map.put("userName","石杰");//经办人姓名 +// map.put("userPhone","15981832653");//经办人手机号 +// map.put("type","1");//类型 0-个人 1-企业 +// map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 +// map.put("enterpriseName","上海欣度网络科技有限公司");//企业名称(类型type为1时必传) +// map.put("signNumber","e746ad74069443349cabc975e5b8d25a"); //0签署方编号 +// +// Map map5 = new HashMap<>(); +// map5.put("userName","孙泽星");//经办人姓名 +// map5.put("userPhone","15981832697");//经办人手机号 +// map5.put("type","0");//类型 0-个人 1-企业 +// map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 +// map5.put("signNumber","c65ba6bb0b7944beba1f664ec8cc5fd4"); //0签署方编号 +// data.add(map); +// data.add(map5); +// String s = JSONObject.toJSONString(data); +// paraMap.put("signatoryInfos",s);//签署方相关信息 +// +// +// +// +// +// paraMap.clear(); +// +//// Map paraMap = new HashMap(); +// +// paraMap.put("applicationId","2205026100"); +// paraMap.put("businessId","95d6eb9ae14b4b6f8770467a37132c82"); +// paraMap.put("isOpen","1"); +// +// CloseableHttpClient httpClient = HttpClients.createDefault(); +// HttpPost httpPost = new HttpPost(apiUrl); +// ObjectMapper objectMapper = new ObjectMapper(); +// String requestBody = objectMapper.writeValueAsString(paraMap); +// +// System.out.println(requestBody); +// StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); +// httpPost.setEntity(requestEntity); +// +// CloseableHttpResponse response = httpClient.execute(httpPost); +// try { +// HttpEntity entity = response.getEntity(); +// BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); +// StringBuilder responseBuilder = new StringBuilder(); +// String line; +// while ((line = reader.readLine()) != null) { +// responseBuilder.append(line); +// } +// System.out.println(responseBuilder.toString()); +// } finally { +// response.close(); +// } + + } + + + public static String callThirdPartyApi(String apiUrl, DhqSign becomeSilentSaveSignDto,SysSignLog signLog ) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(apiUrl); + signLog.setBizId(becomeSilentSaveSignDto.getCustomerOriginationNumber()); + + + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(becomeSilentSaveSignDto); + signLog.setSendBody(requestBody); + signLog.setHtCode(becomeSilentSaveSignDto.getContractModelNum()); + + log.info("请求报文===>"+requestBody); + StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); + httpPost.setEntity(requestEntity); + + CloseableHttpResponse response = httpClient.execute(httpPost); + try { + HttpEntity entity = response.getEntity(); + BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); + StringBuilder responseBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + responseBuilder.append(line); + } + signLog.setContent(responseBuilder.toString()); + return responseBuilder.toString(); + + } finally { + response.close(); + } + } + + + public void accpet(JSONObject jsonObject)throws Exception{ + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + //客户发起合同时定义的编号 + String customerOriginationNumber = jsonObject.getString("customerOriginationNumber"); + //应用 id + String businessId = jsonObject.getString("businessId"); + //合同签署编号 + String contractNum = jsonObject.getString("contractNum"); + //0 签署中 1 签署完成 2-拒绝签署 3 解除中 4 解除完成 5 拒绝解除 + //6-已撤回 7 已过期 + String signState = jsonObject.getString("signState"); + //合同文件 + String contractFile = jsonObject.getString("contractFile"); + //合同名称 + String contractName = jsonObject.getString("contractName"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setContractFile(contractFile); + signLog.setAppId(businessId); + signLog.setBizId(customerOriginationNumber); + + + this.sysSignLogMapper.updateSysSignLog(signLog); + + + if(customerOriginationNumber.startsWith("DHQUZ")){ + //更新用工协议 + UserWorkerBiz uwb = new UserWorkerBiz(); + uwb.setNo(customerOriginationNumber); + if("1".equals(signState)){ + uwb.setSignStatus(1); + }else if("2".equals(signState)){ + uwb.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + fileUrl = fileUrl.replaceAll("http://","https://"); + uwb.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerBiz(uwb); + }else if(customerOriginationNumber.startsWith("DHQQRD")){ + //确认单 + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setSignNo(customerOriginationNumber); + if("1".equals(signState)){ + enroll.setSignStatus(1); + }else if("2".equals(signState)){ + enroll.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + fileUrl = fileUrl.replaceAll("http://","https://"); + enroll.setTaskConfirmFile(fileUrl); + this.sysSignLogMapper.updateMerTaskEnrollInfo(enroll); + }else if(customerOriginationNumber.startsWith("DHQWT")){ + //运营商委托协议 + UserWorkAuth uwa = new UserWorkAuth(); + uwa.setNo(customerOriginationNumber); + if("1".equals(signState)){ + uwa.setSignStatus(1); + }else if("2".equals(signState)){ + uwa.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + uwa.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerAuth(uwa); + } + + + } + } + + private String upLoadOss(String contractFile) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL(contractFile)); + try{ + if(inputStream != null){ + byte[] arrayBytes = IoUtil.readBytes(inputStream); + String fileName = IdUtil.getSnowflakeNextIdStr()+".pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",arrayBytes); + return remoteFile.getUrl(); + } + }finally { + if(inputStream != null){ + inputStream.close(); + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java new file mode 100644 index 0000000..8564068 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java @@ -0,0 +1,205 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.*; +import org.dromara.resource.junziqian.common.JzqUtils; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.mapper.SysSignLogMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.*; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title JzqSignServiceImpl + * @description 大鸿签签约 + * @create 2024-05-15 14:53 + */ + +@Service +@Slf4j +public class JzqSignServiceImpl { + + + @Resource + public SysSignLogMapper sysSignLogMapper; + + @Resource + public RemoteFileService remoteFileService; + + @Autowired + public JzqUtils jzqUtils; + + /*** + * 发起签约 + * @param sign + * @return + * @throws Exception + */ + + + public String becomeSign(JzqSign sign) + { + + return jzqUtils.applySign(sign); + } + + public String bankThreeVerify(String name ,String identityCard,String cardNo){ + return jzqUtils.bankThreeVerify(name ,identityCard,cardNo); + } + + public String link(String applyNo,String fullName,String identityCard,int identityType){ + return jzqUtils.link(applyNo,fullName,identityCard,identityType); + } + + public String userValid(String name ,String identityCard){ + return jzqUtils.userValid(name ,identityCard); + } + + public String ocrIdentity(String file, Integer front) { + return jzqUtils.ocrIdentity(file,front); + } + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + return jzqUtils.bankFourVerify(name,identityCard,cardNo,mobilePhone); + } + + public String ocrBank(File file){ + return jzqUtils.ocrBank(file); + } + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + String s = jzqUtils.startH5Face(orderNo, name, identityCard, backUrl, startFrom); + return s; + } + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + return jzqUtils.organizationCreate(emailOrMobile, name, organizationType, identificationType, organizationRegNo, organizationRegImg, legalName, legalIdentityCard, legalMobile); + } + + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + return jzqUtils.cloudCertiPerInfo(fullName, identityCard, idenFront, idenReverse); + } + + public String linkFile(String applyNo){ + return jzqUtils.linkFile(applyNo); + } + + public String accpet(Map map)throws Exception{ + Object data = map.get("data"); + JSONObject jsonObject = JSONObject.parseObject(data.toString()); + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + + String customerOriginationNumber = jsonObject.getString("applyNo"); + + String signState = jsonObject.getString("signStatus"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setBizId(customerOriginationNumber); + this.sysSignLogMapper.updateSysSignLog(signLog); + UserWorkerBiz uwb = new UserWorkerBiz(); + uwb.setNo(customerOriginationNumber); + if("0".equals(signState)){ + uwb.setSignStatus(0); + }else { + uwb.setSignStatus(1); + } + String s = jzqUtils.linkFile(customerOriginationNumber); + JSONObject json = JSONObject.parseObject(s); + String fileUrl= null; + if (json.getString("success").equals("true")) { + fileUrl = json.getString("data"); + } + signLog.setContractFile(fileUrl); + fileUrl = upLoadOss(fileUrl); + uwb.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerBiz(uwb); + } + + return "{\"success\":true}"; + } + + public String accpetSure(Map map)throws Exception{ + Object data = map.get("data"); + JSONObject jsonObject = JSONObject.parseObject(data.toString()); + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + + String customerOriginationNumber = jsonObject.getString("applyNo"); + + String signState = jsonObject.getString("signStatus"); + + log.info("确认单####################"+signState+"!!!!!!!!!!!!!!!!!!!!!!"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setBizId(customerOriginationNumber); + this.sysSignLogMapper.updateSysSignLog(signLog); + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setSignNo(customerOriginationNumber); + if("0".equals(signState)){ + enroll.setSignStatus(0); + }else { + enroll.setSignStatus(1); + } + String s = jzqUtils.linkFile(customerOriginationNumber); + JSONObject json = JSONObject.parseObject(s); + String fileUrl= null; + if (json.getString("success").equals("true")) { + fileUrl = json.getString("data"); + } + signLog.setContractFile(fileUrl); + fileUrl = upLoadOss(fileUrl); + enroll.setTaskConfirmFile(fileUrl); + this.sysSignLogMapper.updateMerTaskEnrollInfo(enroll); + } + + return "{\"success\":true}"; + } + + + + + private String upLoadOss(String contractFile) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL(contractFile)); + try{ + if(inputStream != null){ + byte[] arrayBytes = IoUtil.readBytes(inputStream); + String fileName = IdUtil.getSnowflakeNextIdStr()+".pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",arrayBytes); + return remoteFile.getUrl(); + } + }finally { + if(inputStream != null){ + inputStream.close(); + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java new file mode 100644 index 0000000..2e7154b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.constant.OssConstant; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.resource.domain.SysOssConfig; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; +import org.dromara.resource.mapper.SysOssConfigMapper; +import org.dromara.resource.service.ISysOssConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 对象存储配置Service业务层处理 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysOssConfigServiceImpl implements ISysOssConfigService { + + private final SysOssConfigMapper baseMapper; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @Override + public void init() { + List list = baseMapper.selectList(); + // 加载OSS初始化配置 + for (SysOssConfig config : list) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + } + + @Override + public SysOssConfigVo queryById(Long ossConfigId) { + return baseMapper.selectVoById(ossConfigId); + } + + @Override + public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + private LambdaQueryWrapper buildQueryWrapper(SysOssConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey()); + lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus()); + lqw.orderByAsc(SysOssConfig::getOssConfigId); + return lqw; + } + + @Override + public Boolean insertByBo(SysOssConfigBo bo) { + SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class); + validEntityBeforeSave(config); + boolean flag = baseMapper.insert(config) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + @Override + public Boolean updateByBo(SysOssConfigBo bo) { + SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class); + validEntityBeforeSave(config); + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, ""); + luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, ""); + luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, ""); + luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, ""); + luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId()); + boolean flag = baseMapper.update(config, luw) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOssConfig entity) { + if (StringUtils.isNotEmpty(entity.getConfigKey()) && !checkConfigKeyUnique(entity)) { + throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { + throw new ServiceException("系统内置, 不可删除!"); + } + } + List list = CollUtil.newArrayList(); + for (Long configId : ids) { + SysOssConfig config = baseMapper.selectById(configId); + list.add(config); + } + boolean flag = baseMapper.deleteBatchIds(ids) > 0; + if (flag) { + list.forEach(sysOssConfig -> + CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); + } + return flag; + } + + /** + * 判断configKey是否唯一 + */ + private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) { + long ossConfigId = ObjectUtil.isNull(sysOssConfig.getOssConfigId()) ? -1L : sysOssConfig.getOssConfigId(); + SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) + .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + return false; + } + return true; + } + + /** + * 启用禁用状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateOssConfigStatus(SysOssConfigBo bo) { + SysOssConfig sysOssConfig = BeanUtil.toBean(bo, SysOssConfig.class); + int row = baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysOssConfig::getStatus, "1")); + row += baseMapper.updateById(sysOssConfig); + if (row > 0) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey()); + } + return row; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java new file mode 100644 index 0000000..6466769 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java @@ -0,0 +1,257 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.URLUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.resource.domain.SysOss; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.dromara.resource.mapper.SysOssMapper; +import org.dromara.resource.service.ISysOssService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOssServiceImpl implements ISysOssService { + + private final SysOssMapper baseMapper; + + @Override + public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = result.getRecords().stream().map(this::matchingUrl).collect(Collectors.toList()); + result.setRecords(filterResult); + return TableDataInfo.build(result); + } + + @Override + public List listByIds(Collection ossIds) { + List list = new ArrayList<>(); + for (Long id : ossIds) { + SysOssVo vo = getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo); + } } + } + return list; + } + + @Override + public String selectUrlByIds(String ossIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo).getUrl()); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo.getUrl()); + } + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + lqw.orderByAsc(SysOss::getOssId); + return lqw; + } + + @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") + @Override + public SysOssVo getById(Long ossId) { + return baseMapper.selectVoById(ossId); + } + + + public SysOssVo getByUrl(String url){ + QueryWrapper query = Wrappers.query(); + query.eq("url",url); + return this.baseMapper.selectVoOne(query); + } + + @Override + public void download(Long ossId, HttpServletResponse response) throws IOException { + SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) { + int available = inputStream.available(); + IoUtil.copy(inputStream, response.getOutputStream(), available); + response.setContentLength(available); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + @Override + public SysOssVo upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + @Override + public SysOssVo upload(File file) { + String originalfileName = file.getName(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix); + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + + public static void main(String[] args) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL("https://towersignal.hn.hayuxin.com/floor_photo/report/410105010000000267/410105010000000267_202403190544333.pdf")); + + byte[] arrayByte = IoUtil.readBytes(inputStream); + + + + + + + } + + private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { + SysOss oss = new SysOss(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalfileName); + oss.setService(configKey); + baseMapper.insert(oss); + SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class); + return this.matchingUrl(sysOssVo); + } + + @Override + public Boolean insertByBo(SysOssBo bo) { + SysOss oss = BeanUtil.toBean(bo, SysOss.class); + boolean flag = baseMapper.insert(oss) > 0; + if (flag) { + bo.setOssId(oss.getOssId()); + } + return flag; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = baseMapper.selectBatchIds(ids); + for (SysOss sysOss : list) { + OssClient storage = OssFactory.instance(sysOss.getService()); + storage.delete(sysOss.getUrl()); + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public void downloadByUrl(String url, HttpServletResponse response) { + if(StringUtils.isEmpty(url)){ + throw new ServiceException("参数url不能为空"); + } + SysOssVo sysOss = SpringUtils.getAopProxy(this).getByUrl(url); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) { + int available = inputStream.available(); + IoUtil.copy(inputStream, response.getOutputStream(), available); + response.setContentLength(available); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * 匹配Url + * + * @param oss OSS对象 + * @return oss 匹配Url的OSS对象 + */ + private SysOssVo matchingUrl(SysOssVo oss) { + OssClient storage = OssFactory.instance(oss.getService()); + // 仅修改桶类型为 private 的URL,临时URL时长为120s + if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { + oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120)); + } + return oss; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java new file mode 100644 index 0000000..7993149 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java @@ -0,0 +1,256 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.common.sms.config.SmsProperties; +import org.dromara.resource.danmi_sms.DMSmsUtils; +import org.dromara.resource.danmi_sms.common.DMSmsResult; +import org.dromara.resource.danmi_sms.config.SmsConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.resource.domain.bo.SysSmsBo; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.resource.service.ISysSmsService; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 短信Service业务层处理 + * + * @author sunzexing + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class SysSmsServiceImpl implements ISysSmsService { + + private final SysSmsMapper baseMapper; + + @Resource + private SmsProperties smsProperties; + + @Autowired + private DMSmsUtils dmSmsUtils; + + + /** + * 查询短信 + */ + @Override + public SysSmsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询短信列表 + */ + @Override + public TableDataInfo queryPageList(SysSmsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询短信列表 + */ + @Override + public List queryList(SysSmsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSmsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getIType() != null, SysSms::getVType, bo.getIType()); + lqw.like(StringUtils.isNotBlank(bo.getVUserName()), SysSms::getVUserName, bo.getVUserName()); + lqw.eq(bo.getIUserId() != null, SysSms::getIUserId, bo.getIUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getVPhone()), SysSms::getVPhone, bo.getVPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getVVerCode()), SysSms::getVVerCode, bo.getVVerCode()); + lqw.eq(StringUtils.isNotBlank(bo.getVTempId()), SysSms::getVTempId, bo.getVTempId()); + lqw.eq(StringUtils.isNotBlank(bo.getVSendContent()), SysSms::getVSendContent, bo.getVSendContent()); + lqw.eq(bo.getDtmSendTime() != null, SysSms::getDtmSendTime, bo.getDtmSendTime()); + lqw.eq(bo.getDtmExpirTime() != null, SysSms::getDtmExpirTime, bo.getDtmExpirTime()); + lqw.eq(bo.getIsUse() != null, SysSms::getIsUse, bo.getIsUse()); + lqw.eq(bo.getIStatus() != null, SysSms::getIStatus, bo.getIStatus()); + return lqw; + } + + /** + * 新增短信 + */ + @Override + public Boolean insertByBo(SysSmsBo bo) { + SysSms add = MapstructUtils.convert(bo, SysSms.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改短信 + */ + @Override + public Boolean updateByBo(SysSmsBo bo) { + SysSms update = MapstructUtils.convert(bo, SysSms.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSms entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除短信 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean sendMpSmsCode(String phone) { + return null; + } + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 13:45 + * 说明:发送公众号登录验证码 + **/ + @Override + public Boolean sendMpSmsCode(String domain, String phone) { +// String key = GlobalConstants.CAPTCHA_CODE_KEY+SmsType.MP.getIType() + phone; +// String code = RandomUtil.randomNumbers(4); +// RedisUtils.setCacheObject(key, code, Duration.ofMinutes(SmsType.MP.getExpireTime())); +// LinkedHashMap map = new LinkedHashMap<>(); +// map.put("code", code); +// map.put("expirs", SmsType.MP.getExpireTime() + ""); +// RemoteSms sysSms = remoteSmsService.send(domain,phone,SmsType.MP,map); + return null; + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 17:22 + * 说明:通用发送短息 + **/ + + public Boolean sendSmsCode(SmsType smsType, + String phonenumber, + LinkedHashMap param, + Map smsConfig) { + + + if(smsConfig == null){ + throw new RuntimeException("短信配置不能为空"); + } + + try{ + java.util.Date currentDate = DateUtil.date().toJdkDate(); +// SmsBlend smsBlend = null; +// String smsFacType = "tencent"; +// String tempKey = (String)smsConfig.get("tempId"); +// String tempId = (String)smsConfig.get(tempKey); +// if(StringUtils.isNotEmpty(smsProperties.getType())){ +// smsFacType = smsProperties.getType(); +// } +// switch (smsFacType){ +// case "aliyun": +// AlibabaConfig alibabaConfig = new AlibabaConfig(); +// alibabaConfig.setAccessKeyId((String)smsConfig.get("accid_aliyun")); +// alibabaConfig.setAccessKeySecret((String)smsConfig.get("acckey_aliyun")); +// alibabaConfig.setSignature((String)smsConfig.get("sign_aliyun")); +// tempId = (String)smsConfig.get(tempKey+"_aliyun"); +// smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA, alibabaConfig); +// break; +// case "tencent": +// TencentConfig tencentConfig = new TencentConfig(); +// tencentConfig.setAccessKeyId((String)smsConfig.get("accid")); +// tencentConfig.setAccessKeySecret((String)smsConfig.get("acckey")); +// tencentConfig.setSignature((String)smsConfig.get("sign")); +// tencentConfig.setSdkAppId((String)smsConfig.get("appid")); +// smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,tencentConfig); +// break; +// } + +// SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, tempId, param); + JSONObject jsonObject = JSON.parseObject((String) smsConfig.get("smsConfig")); + + DMSmsResult result = this.dmSmsUtils.verificationCode((String) smsConfig.get("smsConfig"), phonenumber, param.get("code")); + if(!result.isSuccess()){ + log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phonenumber, result.getErrorMsg()); + } +// +// +// +// +// if (!"OK".equals(smsResponse.getCode())) { +// log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phonenumber, smsResponse); +// } + + + SysSms smsEntity = new SysSms(); + + smsEntity.setIUserId(MpLoginHelper.getUserId()); + smsEntity.setVTempId(jsonObject.get("verification").toString()); + smsEntity.setDtmSendTime(currentDate); + smsEntity.setVType(smsType.getDesc()); + smsEntity.setVSendContent(JsonUtils.toJsonString(param)); + smsEntity.setCreateTime(currentDate); + smsEntity.setVPhone(phonenumber); + // smsEntity.setDtmExpirTime(DateUtil.offsetMinute(currentDate,Constants.CAPTCHA_EXPIRATION)); + + this.baseMapper.insert(smsEntity); + }catch (Exception e){ + e.printStackTrace(); + log.error("发送短信失败==>",e.getMessage()); + throw e; + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml new file mode 100644 index 0000000..92e3701 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml @@ -0,0 +1,74 @@ +# Tomcat +server: + port: 9204 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-resource + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml + +junziqian: + Services_URL: https://api.sandbox.junziqian.com + AppKey: 2c4399d12cd9ff33 + AppSecret: 87d3e6a62c4399d12cd9ff33c01f2d37 + +#旦米短信 +danmisms: + base_url: https://openapi.danmi.com/textSMS/sendSMS/V1 + account_sid: 8315b08c67c30decd030fc25d9766fd6 + auth_token: be7e9a3738882ca188d85e9d45823a09 + defalutCode: + + sig: 薪资社 + #验证码 + verification: 1000000008982 + #充值到账 + recharge: 407811 + #退款到账 + refund: 407812 + #发放完成 + giveout: 407813 + #账户余额 + balance: 407814 + #商户入驻 + merchant: 407801 + #代理入驻 + agent: 407809 + #签约提醒 + tosign: 407810 + #充值信息 + rechargeInfo: 461126 + #开票信息 + invoce: 460599 + +ruoyi: + captchaSMS: 1 + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt new file mode 100644 index 0000000..f589ce2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + (_) + _ __ _ _ ___ _ _ _ ______ _ __ ___ ___ ___ _ _ _ __ ___ ___ +| '__| | | |/ _ \| | | | |______| '__/ _ \/ __|/ _ \| | | | '__/ __/ _ \ +| | | |_| | (_) | |_| | | | | | __/\__ \ (_) | |_| | | | (_| __/ +|_| \__,_|\___/ \__, |_| |_| \___||___/\___/ \__,_|_| \___\___| + __/ | + |___/ diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml new file mode 100644 index 0000000..ffad843 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml new file mode 100644 index 0000000..2573ebb --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml new file mode 100644 index 0000000..b14416a --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml @@ -0,0 +1,44 @@ + + + + + + + update sys_sign_log set update_time = now() + ,sign_state = #{signState} + ,app_id = #{appId} + ,contract_file = #{contractFile} + + biz_id = #{bizId} + + + + + + update user_worker_business set update_time = now() + , sign_file_url = #{signFileUrl} + , sign_status = #{signStatus} + where no = #{no} + + + + + update mer_task_enroll set update_time = now() + ,task_confirm_file = #{taskConfirmFile} + ,sign_status = #{signStatus} + where sign_no = #{signNo} + + + + + + update user_worker_authorized set update_time = now() + ,sign_file_url = #{signFileUrl} + ,sign_status = #{signStatus} + where no =#{no} + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml new file mode 100644 index 0000000..5e2301f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-settlement/Dockerfile b/ruoyi-modules/ruoyi-settlement/Dockerfile new file mode 100644 index 0000000..dd84464 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/settlement/logs \ + /ruoyi/settlement/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/settlement + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-settlement.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar b/ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar new file mode 100644 index 0000000..dfabb34 Binary files /dev/null and b/ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar differ diff --git a/ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar b/ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar new file mode 100644 index 0000000..0a528a7 Binary files /dev/null and b/ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar differ diff --git a/ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar b/ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar new file mode 100644 index 0000000..e5da926 Binary files /dev/null and b/ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar differ diff --git a/ruoyi-modules/ruoyi-settlement/pom.xml b/ruoyi-modules/ruoyi-settlement/pom.xml new file mode 100644 index 0000000..8ca534b --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/pom.xml @@ -0,0 +1,194 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-settlement + + + ruoyi-settlement系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + org.dromara + ruoyi-api-settlement + + + + com.alipay.sdk + alipay-sdk-java + 4.31.84.ALL + + + + com.jcraft + jsch + 0.1.55 + + + + com.cfca + logback-cfca-jdk1.6 + 3.1.0.0 + system + ${project.basedir}/libs/logback-cfca-jdk1.6-3.1.0.0.jar + + + + cmbc.cfca + SADK-CMBCNew + 3.1.5.0 + system + ${project.basedir}/libs/SADK-CMBCNew-3.1.5.0.jar + + + + cryptokit.jni + cryptokit-jni + 1.0 + system + ${project.basedir}/libs/cryptokit.jni-1.0.jar + + + + + com.qiniu + qiniu-java-sdk + 7.4.0 + + + gson + com.google.code.gson + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java new file mode 100644 index 0000000..b9925d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java @@ -0,0 +1,31 @@ +package org.dromara.settlement; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +import java.security.Security; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiSettlementApplication { + static { + Security.addProvider(new BouncyCastleProvider()); + } + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiSettlementApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 结算模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java new file mode 100644 index 0000000..9f02a5d --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java @@ -0,0 +1,66 @@ +package org.dromara.settlement.common; + +/** + * 系统业务常量 + * @author 张涛 + * @date 2016年11月15日 + */ +public class BussinessVariable { + /** + * 批量插入参数的最多数量(由于slqserver机制,最多2100个参数) + */ + public static final int DB_BATCH_INSERT_PARAM_SIZE = 2100; + + /** + * 默认短信签名 + */ + public static final String SMS_SIGN_DEFAULT = "【乐贝通】"; + + /** + * 获取批量插入最大数量 + * @author 张涛 + * @date 2016年11月15日 + * @param propertySize 每条的属性数量 + * @return 一次最大批量插入数量 + */ + public static int getMaxSizeOfInsert(int propertySize){ + return ((int)Math.floor(DB_BATCH_INSERT_PARAM_SIZE/propertySize)-1); + } + + /** + * 默认短信署名 + */ + public final static String SMS_SIGN = "乐贝通"; + + /**用户类型---老师*/ + public final static int USERTYPE_TEACHER = 1; + /**用户类型---家长*/ + public final static int USERTYPE_PARENT = 3; + /**用户类型---学生*/ + public final static int USERTYPE_STUDENT = 2; + + /** + * 短信字数限制(SP业务) + */ + public final static int SMS_WORDS_SP = 288; + + /** + * 短信字数限制(非SP业务) + */ + public final static int SMS_WORDS_NSP = 35; + + /** + * 短信字数限制(非SP业务:含短信猫) + */ + public final static int SMS_WORDS_FNSP = 139; + + /** + * 短信后缀 + */ + public final static String SMS_SUFFIX = "登录童忆园APP查看更多家校通知!下载APP:itongyiyuan.com"; + + /** + * 家长考勤业务对应的模块 + */ + public final static String MODULE_ATTENDANCE = "408,411"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java new file mode 100644 index 0000000..8426ce0 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java @@ -0,0 +1,643 @@ +/** + * FileName: MessageAletsByJavaClient.java + * @Description: TODO(本类封装所有关于短信提醒工具类提供给第三方平台使用) + * All rights Reserved, Designed By 上海神洲数港有限公司 + * Copyright: Copyright(C) 2010-2011 + * Company 上海神洲数港有限公司 LTD. + * @author: chivalrous + * @version V1.0 + * Createdate: 2012-8-26 上午10:56:22 + * Modification History: + * Date Author Version Discription + * ---------------------------------------------------------------------------------- + * 2012-8-26 chivalrous 1.0 1.0 + * Why & What is modified: <修改原因描述> + */ +package org.dromara.settlement.common; + + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.common.http.MyX509TrustManager; +import org.dromara.settlement.common.http.SynRequestThread; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMethod; +import org.dromara.common.core.constant.Constants; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class PostDataTools { + + private static Logger log = LoggerFactory.getLogger(PostDataTools.class); + + // 定义一个私有构造方法 + private PostDataTools() { + } + //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用) + private static volatile PostDataTools instance; + + //定义一个共有的静态方法,返回该类型实例 + public static PostDataTools getIstance() { + // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率) + if (instance == null) { + //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) + synchronized (PostDataTools.class) { + //未初始化,则初始instance变量 + if (instance == null) { + instance = new PostDataTools(); + } + } + } + return instance; + } + + private int HTTP_CONNECTTIMEOUT = 10000;//连接超时时间(10秒) + + private int HTTP_READTIMEOUT = 20000;//读取内容超时时间(20秒) + /** + * 采用HTTP BASIC AUTHENTICATION 进行加密帐号 + */ + private String userName; + + /** + * 采用HTTP BASIC AUTHENTICATION 进行加密密码 + */ + private String passwd; + + /** + * 异步请求线程 + */ + private SynRequestThread synThread; + + public SynRequestThread getSynThread() { + if (synThread == null || !synThread.isRunning()) { + //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) + synchronized (this) { + //未初始化,则初始instance变量 + if (synThread == null || !synThread.isRunning()) { + if(synThread != null) + synThread.close(); + synThread = new SynRequestThread(); + synThread.start(); + } + } + } + return synThread; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPasswd() { + return passwd; + } + + public void setPasswd(String passwd) { + this.passwd = passwd; + } + + public void setBasicAuth(String userName, String passwd) { + this.userName = userName; + this.passwd = passwd; + } + + /** + * + * @Title: sendMessageInfo + * @Description: TODO(使用该工具类下需要手动将{@code SendInfoMessage}所用需要配置的字段 + * 一定必须SET相应的参数) + * @param: @param sendInfoMessage + * @param: @return + * @return: boolean + * @throws + */ + public String sendMessageInfo(String hostURl,Object o) { + return sendMessageInfo(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true); + } + + public String sendMessageInfo(String hostURl,Object o,boolean auth) { + return sendMessageInfo(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},auth,true); + } + + /** + * 发送ajax请求,不等待结果 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + */ + public void sendMessageInfoOfAjax(String hostURl,Object o) { + sendMessageInfoOfAjax(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true); + } + + /** + * 发送ajax请求,不等待结果 + * @author 张涛 + * @date 2016年12月3日 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param o 参数对象 + */ + public void sendMessageInfoOfAjax(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + //sendMessageInfo(o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true,false); + try { + String bodyContent = ""; + if(isJsonParam && o != null) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o+""; + log.info("request url:"+hostURl + ",request body:" + bodyContent); + HttpPost postMethod = new HttpPost(hostURl); + postMethod.setConfig(RequestConfig.custom().setSocketTimeout(HTTP_READTIMEOUT).setConnectTimeout(HTTP_CONNECTTIMEOUT).build()); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + postMethod.addHeader(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + postMethod.addHeader("Authorization", "Basic " + getAuthToken()); + } + if(StringUtils.isNotBlank(bodyContent)){ + if(isJsonParam) + postMethod.setEntity(new StringEntity(bodyContent,ContentType.APPLICATION_JSON)); + else + postMethod.setEntity(new StringEntity(bodyContent,ContentType.create(ContentType.APPLICATION_FORM_URLENCODED.getMimeType(), Constants.UTF8))); + } + getSynThread().sendRequest(postMethod); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + } + + /** + * 获取接口Basic认证token + * @author 张涛 + * @date 2016年10月17日 + * @param userName + * @param passwd + * @return + */ + public String getAuthToken(){ + String authString = this.userName + ":" + this.passwd; + byte[] authEncBytes = Base64.encodeBase64(authString.getBytes()); + return new String(authEncBytes); + } + + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth){ + return sendMessageInfo(hostURl,o, requestHeaders, auth, true); + } + + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + return sendMessageInfo(hostURl,o, requestHeaders, auth, isJsonParam,true,null,null); + } + + public String sendHttpsMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + return sendHttpsMessageInfo(hostURl,o, requestHeaders, auth, isJsonParam,true); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月12日 + * @param o + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月31日 + * @param o + * @param readTimeout 读取请求结果最长时间(毫秒) + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o,Integer readTimeout) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false,true,readTimeout,null); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月31日 + * @param o + * @param readTimeout 读取请求结果最长时间(毫秒) + * @param connectTimeout 请求连接最长时间(毫秒) + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o,Integer readTimeout,Integer connectTimeout) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false,true,readTimeout,connectTimeout); + } + + /** + * 发送http请求 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param returnResult 是否等待返回结果 + * @param readTimeout 读取请求结果最长时间(毫秒) + * @param connectTimeout 请求连接最长时间(毫秒) + * @return + */ + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam,boolean returnResult,Integer readTimeout,Integer connectTimeout) { + + String output = ""; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + // 接口URL + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod(RequestMethod.POST.toString()); + if(connectTimeout == null) + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + else + conn.setConnectTimeout(connectTimeout); + if(readTimeout == null) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + else + conn.setReadTimeout(readTimeout); + conn.setDoOutput(true); + if(!returnResult) + conn.setDoInput(false); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + String bodyContent = ""; + if(isJsonParam) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o.toString(); + log.info("request body:" + bodyContent); + os = conn.getOutputStream(); + os.write(bodyContent.getBytes("utf-8")); + os.flush(); + if(returnResult){ + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + }else + log.info("request url:"+hostURl); + } catch (Exception e) { + log.error("request url:"+hostURl, e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * 发送https请求 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param returnResult 是否等待返回结果 + * @return + */ + public String sendHttpsMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam,boolean returnResult) { + String output = ""; + String s; + HttpsURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + //创建SSLContext + SSLContext sslContext=SSLContext.getInstance("SSL"); + TrustManager[] tm={new MyX509TrustManager()}; + //初始化 + sslContext.init(null, tm, new java.security.SecureRandom());; + //获取SSLSocketFactory对象 + SSLSocketFactory ssf=sslContext.getSocketFactory(); + // 接口URL + URL url = new URL(hostURl); + conn = (HttpsURLConnection) url.openConnection(); + conn.setRequestMethod(RequestMethod.POST.toString()); + //设置当前实例使用的SSLSoctetFactory + conn.setSSLSocketFactory(ssf); + conn.setConnectTimeout(30000);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(30000);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + if(!returnResult) + conn.setDoInput(false); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + String bodyContent = ""; + if(isJsonParam) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o.toString(); + log.info("request body:" + bodyContent); + os = conn.getOutputStream(); + os.write(bodyContent.getBytes("utf-8")); + os.flush(); + if(returnResult){ + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + }else + log.info("request url:"+hostURl); + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * + * @Title: sendMessageInfo + * @Description: TODO(使用该工具类下需要手动将{@code SendInfoMessage}所用需要配置的字段 + * 一定必须SET相应的参数) + * @param: @param sendInfoMessage + * @param: @return + * @return: boolean + * @throws + */ + public String sendMessageInfoWithTimeOut(String hostURl,Object o) { + + String output = "error"; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + conn.setRequestMethod(RequestMethod.POST.toString()); + conn.setRequestProperty("Content-Type", + "application/json;charset=utf-8"); + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + // 将短信内容转换为JSON字符串进行转码 + String jsonString = JSONObject.toJSONString( + o); + os = conn.getOutputStream(); + os.write(jsonString.getBytes("utf-8")); + os.flush(); + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output = s; + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + System.out.println(output); + return output; + } + + /** + * 发送 + * @param hostURl + * @param o + * @return + */ + public String sendPRCUrlWithParam(String hostURl,Object o) { + + String output = "error"; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + conn.setRequestMethod(RequestMethod.POST.toString()); + conn.setRequestProperty("Content-Type", + "application/json;charset=utf-8"); + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + // 将短信内容转换为JSON字符串进行转码 + String jsonString = JSONObject.toJSONString( + o); + os = conn.getOutputStream(); + os.write(jsonString.getBytes("utf-8")); + os.flush(); + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + + if(200 == conn.getResponseCode()){ + return "1"; + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * 无参数传递调用 + * + * @return + */ + public String sendMessageNullParam(String hostURl) { + return sendMessageNullParam(hostURl,RequestMethod.POST, + new String[] { "Content-Type:application/json" },null); + } + + /** + * 无参数指定请求 + * @author 张涛 + * @date 2017年5月27日 + * @param method + * @return + */ + public String sendFormMessageNullParam(String hostURl,RequestMethod method,Integer readTimeout) { + return sendMessageNullParam(hostURl,method, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" },readTimeout); + } + + /** + * 无参数传递调用 + * + * @author 张涛 + * @date 2015年12月21日 + * @param method + * get post + * @return + */ + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,Integer readTimeout){ + return sendMessageNullParam(hostURl,method, requestHeaders, true,readTimeout); + } + + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,boolean auth){ + return sendMessageNullParam(hostURl,method, requestHeaders, auth,null); + } + + /** + * 无参数传递调用 + * + * @author 张涛 + * @date 2015年12月21日 + * @param method + * get post + * @return + */ + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,boolean auth,Integer readTimeout) { + String output = ""; + String s; + HttpURLConnection conn = null; + BufferedReader br = null; + try { + // 接口URL + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + conn.setRequestMethod(method.toString()); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + if(readTimeout != null) + conn.setReadTimeout(readTimeout);//设置从主机读取数据超时(单位:毫秒) + else + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()+ ",response:" + output); + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java new file mode 100644 index 0000000..fd345b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java @@ -0,0 +1,179 @@ +package org.dromara.settlement.common; + +import org.dromara.common.core.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.*; + + +public class PropertyUtils { + private static final Logger log=LoggerFactory.getLogger(PropertyUtils.class); + + public PropertyUtils(){} + + public PropertyUtils(String fileName){ + properties = new Properties(); + InputStream is = null; + InputStreamReader isr = null; + try { + is = PropertyUtils.class.getClassLoader().getResourceAsStream(fileName); + isr = new InputStreamReader(is, "UTF-8"); + properties.load(isr); + } catch (IOException e) { + log.error(e.getMessage(),e); + }finally{ + try { + if(isr != null) + isr.close(); + if(is != null) + is.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放"+fileName+"配置文件失败",e); + } + } + } + + public static String getPropertiesByKey(String key ,String fileName) { + Properties p = new Properties(); + InputStream is = null; + InputStreamReader isr = null; + try { + is = PropertyUtils.class.getClassLoader().getResourceAsStream(fileName); + isr = new InputStreamReader(is, "UTF-8"); + p.load(isr); + } catch (IOException e) { + log.error(e.getMessage(),e); + }finally{ + try { + if(isr != null) + isr.close(); + if(is != null) + is.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放"+fileName+"配置文件失败",e); + } + } + return p.getProperty(key); + } + + public List getList(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptyList(); + } + List list = new ArrayList(); + Enumeration en = properties.propertyNames(); + String key; + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + list.add(properties.getProperty(key)); + } + } + return list; + } + + public Set getSet(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptySet(); + } + Setset=new TreeSet(); + Enumeration en = properties.propertyNames(); + String key; + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + set.add(properties.getProperty(key)); + } + } + return set; + } + + + public Map getMap(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptyMap(); + } + Map map = new HashMap(); + Enumeration en = properties.propertyNames(); + String key; + int len = prefix.length(); + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + map.put(key.substring(len), properties.getProperty(key)); + } + } + return map; + } + + public Properties getProperties(String prefix) { + Properties props = new Properties(); + if (properties == null || prefix == null) { + return props; + } + Enumeration en = properties.propertyNames(); + String key; + int len = prefix.length(); + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + props.put(key.substring(len), properties.getProperty(key)); + } + } + return props; + } + + public String getPropertiesString(String key) { + String property = ""; + if (properties == null || key == null) { + return property; + } + return properties.getProperty(key); + } + + public Integer getPropertiesInteger(String prefix) { + String value = getPropertiesString(prefix); + return StringUtils.isNotBlank(value) ? Integer.parseInt(value) : 0; + } + + public static Properties getProperties(File file) { + Properties props = new Properties(); + InputStream in = null; + try { + in = new FileInputStream(file); + props.load(in); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally{ + try { + if(in != null) + in.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + if(file != null) + log.error("释放"+file.getName()+"配置文件失败",e); + } + } + return props; + } + + public static String getPropertyValue(File file,String key) { + Properties props=getProperties(file); + return (String) props.get(key); + } + + private Properties properties; + + public void setProperties(Properties properties) { + this.properties = properties; + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java new file mode 100644 index 0000000..dbde4ce --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java @@ -0,0 +1,189 @@ +package org.dromara.settlement.common; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.qiniu.common.QiniuException; +import com.qiniu.common.Zone; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import com.qiniu.util.StringMap; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.net.HttpURLConnection; +import java.net.URL; +import org.dromara.settlement.domain.qiniu.UploadPolicy; +import org.dromara.settlement.domain.qiniu.ImageInfo; + +public class QiniuUtils { + private static final Logger log = LoggerFactory.getLogger(QiniuUtils.class); + + /** + * 获取上传凭证 config 上传配置 + * + * @return + */ + public static String getUptoken(String accessKey,String secretKey,String bucket,UploadPolicy policy, String pipeline) { + try { + Auth auth = getAuth(accessKey,secretKey); + // 请确保该bucket已经存在 + if(policy != null && policy.getDeadline() == 0) + policy.setDeadline(3600L);// 默认1个小时,秒 + StringMap map = null; + if (policy != null) { + map = new StringMap(); + if (!StringUtils.isBlank(policy.getScope())) + map.put("scope",policy.getScope()); + if (!StringUtils.isBlank(policy.getCallbackUrl())) + map.put("callbackUrl",policy.getCallbackUrl()); + if (!StringUtils.isBlank(policy.getCallbackBody())) + map.put("callbackBody",policy.getCallbackBody()); + if (!StringUtils.isBlank(policy.getReturnUrl())) + map.put("returnUrl",policy.getReturnUrl()); + if (!StringUtils.isBlank(policy.getReturnBody())) + map.put("returnBody",policy.getReturnBody()); + if (!StringUtils.isBlank(policy.getEndUser())) + map.put("endUser",policy.getEndUser()); + if (!StringUtils.isBlank(policy.getSaveKey())) + map.put("saveKey",policy.getSaveKey()); + if (policy.getInsertOnly() > 0) + map.put("insertOnly",policy.getInsertOnly()); + if (policy.getDetectMime() > 0) + map.put("detectMime",policy.getDetectMime()); + if (policy.getFsizeLimit() > 0) + map.put("fsizeLimit",policy.getFsizeLimit()); + if (!StringUtils.isBlank(policy.getPersistentNotifyUrl())) + map.put("persistentNotifyUrl",policy + .getPersistentNotifyUrl()); + if (!StringUtils.isBlank(policy.getPersistentOps())) + map.put("persistentOps",policy.getPersistentOps()); + if (!StringUtils.isBlank(pipeline)) + map.put("persistentPipeline",pipeline); + } + if(map != null) + return auth.uploadToken(bucket, null, policy.getDeadline(), map); + return auth.uploadToken(bucket); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return ""; + } + + public static Auth getAuth(String accessKey,String secretKey) { + return Auth.create(accessKey, secretKey); + } + + public static String getFilePath(String domain,String key) { + if (StringUtils.isNotBlank(key) + && key.indexOf("/") == -1) { + return domain + key; + } + return key; + } + + /** + * 根据URL获取对应七牛的key + * + * @param url + * @return + */ + public static String getKeyByUrl(String domain,String url) { + String prefix = domain; + if (StringUtils.isNotBlank(url) && url.indexOf(prefix) != -1) + return url.substring(prefix.length()); + return url; + } + + /** + * 获取七牛中图片基础信息 + * @author 张涛 + * @date 2016年3月22日 + * @param url + * @return + */ + public static ImageInfo getImageInfo(String url){ + ImageInfo imageInfo = null; + String oldUrl = url; + try { + url += "?imageInfo"; + PostDataTools post = PostDataTools.getIstance(); + String result = post.sendMessageNullParam(url, RequestMethod.GET,null,false); + imageInfo = JSONObject.parseObject(result, ImageInfo.class); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + imageInfo = new ImageInfo(); + log.error(e.getMessage(), e); + } + imageInfo.setUrl(oldUrl); + return imageInfo; + } + + /** + * 获取上传七牛的文件大小 + * + * @param key + * @return + */ + public static Long getFileSize(String domain,String key) { + /* + * RSClient client = new RSClient(getMac()); Entry statRet = + * client.stat(getBucket(), key); if(statRet != null) return + * statRet.getFsize(); return Long.valueOf("0"); + */ + HttpURLConnection connection = null; + try { + URL url = new URL(getFilePath(domain,key)); + connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); + int res = connection.getResponseCode(); + if (res == 200) { + return Integer.valueOf(connection.getContentLength()) + .longValue(); + } + } catch (Exception e) { + return Long.parseLong(0+""); + } finally { + if (connection != null) + connection.disconnect(); + } + return Long.parseLong(0+""); + } + + public static DefaultPutRet upLoadFile(String accessKey,String secretKey,String bucket,String display,String fileName) + { +// ImageUtil.GenerateImage(display, "d:/soft/" +fileName + ".jpg"); + DefaultPutRet putRet = null; + Configuration cfg = new Configuration(Zone.zone0()); //zong1() 代表华北地区 + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = getAuth(accessKey,secretKey); + String upToken = auth.uploadToken(bucket); + try { + byte[] b = Base64.decodeBase64(new String(display).getBytes()); + Response response = uploadManager.put(b, fileName, upToken); + //解析上传成功的结果 + putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + System.out.println(putRet.key); + System.out.println(putRet.hash); + } catch (QiniuException ex) { + Response r = ex.response; + System.err.println(r.toString()); + try { + System.err.println(r.bodyString()); + } catch (QiniuException ex2) { + //ignore + } + } + catch(Exception e) + { + e.printStackTrace(); + } + return putRet; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java new file mode 100644 index 0000000..08fb7ae --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java @@ -0,0 +1,25 @@ +package org.dromara.settlement.common.bank.jiaotong; + +public class JiaoTongConfig { + public String CorpNo = "0009848835_"; + + public String UserNo = "00003_"; + + public String URL = "http://218.28.196.178:18899/_"; + + public String SUPERACC = "411611999011002389355_"; + + public String SUPERACCNAME = "河南晟润数字科技有限公司_"; + + public String CUSTNO = "0115684019501638_"; + + public String CALLBACKHOST = "218.28.196.178_"; + + public String CALLBACKPORT = "12022_"; + + public String CALLBACKNAME = "jiaotong_"; + + public String CALLBACKPASSWORD = "jichai@2022_"; + + public String PAYTYPE = "S_"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java new file mode 100644 index 0000000..9e92f82 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java @@ -0,0 +1,45 @@ +package org.dromara.settlement.common.bank.jiaotong; + +import org.dom4j.Element; + +public class JiaoTongResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private Element data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public Element getData() { + return data; + } + + public void setData(Element data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java new file mode 100644 index 0000000..9e161cf --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java @@ -0,0 +1,243 @@ +package org.dromara.settlement.common.bank.jiaotong; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import com.alibaba.fastjson.JSONObject; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class JiaoTongUtil { + private static final Logger log = LoggerFactory.getLogger(JiaoTongUtil.class); + + private static class SingletonHolder { + private static final JiaoTongUtil INSTANCE = new JiaoTongUtil(); + } + + private JiaoTongUtil() { + } + + public static final JiaoTongUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + System.out.println(5%2); + } + + public Result request(JiaoTongConfig config, String funcode, String reqid, String body) { + // AES加密 + String request = ""; + String res = ""; + try { + StringBuilder sb = new StringBuilder(); + sb.append(""); + sb.append(""); + sb.append("" + funcode + ""); + sb.append("" + config.CorpNo + ""); + sb.append("" + config.UserNo + ""); + sb.append("" + reqid + ""); + Date curDate = new Date(); + sb.append("" + + DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, curDate).replace("-", "") + + ""); + sb.append("" + + DateUtils.parseDateToString(DateUtils.HH_mm_ss, curDate).replace("-", "") + + ""); + sb.append("1"); + sb.append("0"); + sb.append(""); + sb.append(""); + sb.append(body); + sb.append(""); + sb.append(""); + request = sb.toString(); + log.info("request: (" + config.URL+"),"+request); + res = doPostForm(config.URL, request); + log.info("response: " + res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("交通银行api调用出错(" + JSONObject.toJSONString(config) + "," + funcode + "," + reqid + "," + body + + "):", e); + } + Result rtn = new Result(); + rtn.setResult(request); + rtn.setRtnData(res); + return rtn; + } + + public Result response(JiaoTongConfig config, String response) { + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + Document doc = DocumentHelper.parseText(response); + Element rootElt = doc.getRootElement(); + Element head = rootElt.element("head"); + JiaoTongResponse data = new JiaoTongResponse(); + data.setData(rootElt.element("body")); + data.setReqid(head.elementText("req_no")); + data.setResultcode(head.elementText("particular_code")); + data.setResultmsg(head.elementText("ans_info") + ":" + head.elementText("particular_info")); + rtn.setRtnData(data); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析交通银行响应出错(" + JSONObject.toJSONString(config) + "," + response + "):", e); + } + return rtn; + } + + // 发送Post请求 + public String doPostForm(String httpUrl, String xml) throws Exception { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + if (StringUtils.isNotBlank(httpUrl)) { + URL url = new URL(httpUrl); + SSLContext sslcontext; + sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[] { new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } }, new java.security.SecureRandom()); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + // 新建连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置为POST请求 + connection.setRequestMethod("POST"); + // 设置连接超时时长 + connection.setConnectTimeout(15000); + // 设置读取超时 + connection.setReadTimeout(60000); + connection.setInstanceFollowRedirects(true); + + connection.setDoOutput(true); + connection.setDoInput(true); + + connection.setRequestProperty("Content-Type", "application/xml"); + os = connection.getOutputStream(); + os.write(xml.getBytes("GBK")); + if (connection.getResponseCode() != 200) { + is = connection.getErrorStream(); + } else { + is = connection.getInputStream(); + } + br = new BufferedReader(new InputStreamReader(is, "GBK")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + while ((temp = br.readLine()) != null) { + sbf.append(temp); + } + result = sbf.toString(); + } + } finally { + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 关闭连接 + if(connection != null) { + connection.disconnect(); + } + } + return result; + } + + /** + * 解析多域串内容 + * @author 张涛 + * @date 2022年7月1日 + * @param dataStr 多域串内容 + * @param fieldNum 字段数 + * @return + */ + public List> getMutiAreaData(String dataStr,int fieldNum){ + List> data = new ArrayList>(); + if (StringUtils.isNotBlank(dataStr)) { + String[] dataArr = dataStr.split("\\|"); + if (dataArr.length > fieldNum) { + //key:字段索引 value:字段名称 + Map fieldIndex = new HashMap(); + Map rowData = null; + for (int i = 0,len = dataArr.length; i < len; i++) { + if (i < fieldNum) { + fieldIndex.put(i, dataArr[i]); + }else { + Integer index = i % fieldNum;//当前字段索引 + if (index == 0) { + rowData = new HashMap(); + data.add(rowData); + } + rowData.put(fieldIndex.get(index), dataArr[i]); + } + } + } + } + return data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java new file mode 100644 index 0000000..82b8d46 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java @@ -0,0 +1,60 @@ +package org.dromara.settlement.common.bank.minsheng; + +/** + * 加解密实体类 + * + * @author adt-huangyh + */ +public class EcpSecurityResult { + /** + * 明文 + */ + private String plainText; + + /** + * 签名 + */ + private String signature; + + /** + * 密文 + */ + private String cipherText; + + /** + * 验签结果 + */ + private boolean verifyPass; + + public String getPlainText() { + return plainText; + } + + public void setPlainText(String plainText) { + this.plainText = plainText; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getCipherText() { + return cipherText; + } + + public void setCipherText(String cipherText) { + this.cipherText = cipherText; + } + + public boolean isVerifyPass() { + return verifyPass; + } + + public void setVerifyPass(boolean verifyPass) { + this.verifyPass = verifyPass; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java new file mode 100644 index 0000000..6283557 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java @@ -0,0 +1,263 @@ +package org.dromara.settlement.common.bank.minsheng; + +import cmbc.cfca.sm2.signature.SM2PublicKey; +import cmbc.cfca.sm2rsa.common.Mechanism; +import cmbc.cfca.util.CertUtil; +import cmbc.cfca.util.EnvelopeUtil; +import cmbc.cfca.util.KeyUtil; +import cmbc.cfca.util.SignatureUtil2; +import cmbc.cfca.util.cipher.lib.JCrypto; +import cmbc.cfca.x509.certificate.X509Cert; +import cmbc.cfca.x509.certificate.X509CertHelper; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.security.PrivateKey; +import java.security.PublicKey; + +/* * + * 加解密工具类 + * 使用民生定制cfca安全处理包,解决商户方多个jar包版本的冲突问题 + * @author adt-huangyh + * + */ +public class EcpSecurityUtil { + private static final Logger logger = LoggerFactory.getLogger(EcpSecurityUtil.class); + private static final String charset = "utf-8"; + private static final String signAlg = cmbc.cfca.sm2rsa.common.Mechanism.SM3_SM2; + private static cmbc.cfca.util.cipher.lib.Session session = null; + + static { + try { + JCrypto.getInstance().initialize(JCrypto.JSOFT_LIB, null); + session = JCrypto.getInstance().openSession(JCrypto.JSOFT_LIB); + } catch (cmbc.cfca.sm2rsa.common.PKIException e) { + logger.error("获取session失败:" + e.getMessage()); + } + } + + /** + * 加密加签 + * + * @param plainText 明文 + * @param priKeyPath 私钥路径 + * @param priKeyPwd 私钥密码 + * @param certPath 公钥路径 + * @return + * @throws Exception + */ + public static EcpSecurityResult encryptAndSign(String plainText, String priKeyPath, String priKeyPwd, + String certPath) throws Exception { + EcpSecurityResult sr = new EcpSecurityResult(); + String cipherText = encrypt(plainText, certPath); + sr.setCipherText(cipherText); + String signature = sign(plainText, priKeyPath, priKeyPwd); + sr.setSignature(signature); + return sr; + } + + /** + * 使用公钥进行Sm2加密 + * + * @param plainText 明文 + * @param certPath 公钥路径 + * @return + * @throws Exception + * @function + */ + public static String encrypt(String plainText, String certPath) throws Exception { + X509Cert cert = null; + logger.debug("明文:" + plainText); + try { + cert = X509CertHelper.parse(certPath); + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。sm2Path=" + certPath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + try { + X509Cert[] certs = {cert}; + byte[] base64Bytes = EnvelopeUtil.envelopeMessage(plainText.getBytes(charset), Mechanism.SM4_CBC, certs, session); + String cipherText = new String(base64Bytes, charset); + logger.debug("密文:" + cipherText); + return cipherText; + } catch (Throwable t) { + String msg = "加密失败"; + logger.error(msg); + throw new Exception(msg, t); + } + + } + + /** + * 签名 + * + * @param plainText 待签名的明文 + * @param priKeyPath 己方私钥文件路径 + * @param priKeyPwd 己方私钥文件密码 + * @return + * @throws Exception + * @function + */ + public static String sign(String plainText, String priKeyPath, String priKeyPwd) throws Exception { + String signature = null; + logger.debug("签名开始。。"); + String sm2FileData = readFileToString(priKeyPath, charset); + try { + PrivateKey priKey = KeyUtil.getPrivateKeyFromSM2(sm2FileData.getBytes(charset), priKeyPwd); + SignatureUtil2 signatureUtil = new SignatureUtil2(); + signatureUtil.setSm2WithZFlag(true); + // 签名 + byte[] base64P1SignedData = signatureUtil.p1SignMessage(signAlg, + plainText.getBytes(charset), priKey, session); + signature = new String(base64P1SignedData, charset); + logger.debug("签名内容:" + signature); + } catch (Exception e) { + logger.error("签名失败"); + throw new Exception("签名失败", e); + } + return signature; + } + + /** + * 解密 + * + * @param cipherText 密文 + * @param signature 签名 + * @param priKeyPath 私钥路径 + * @param priKeyPwd 私钥密码 + * @param pubKeyPath 公钥路径 + * @return + * @throws Exception + */ + public static EcpSecurityResult decryptAndVerify(String cipherText, String signature, String priKeyPath, String priKeyPwd, String pubKeyPath) throws Exception { + EcpSecurityResult sr = new EcpSecurityResult(); + sr.setCipherText(cipherText); + sr.setSignature(signature); + PrivateKey priKey; + X509Cert cert; + try { + priKey = getPrivateKeyFromSM2Path(priKeyPath, priKeyPwd); + cert = getX509CertFromSm2Path(priKeyPath); + byte[] base64Bytes = cipherText.getBytes(charset); + byte[] decryptBytes = EnvelopeUtil.openEvelopedMessage(base64Bytes, priKey, cert, session); + String decryptText = new String(decryptBytes, charset); + sr.setPlainText(decryptText); + } catch (Throwable t) { + String msg = "解密失败"; + logger.error(msg); + throw new Exception(msg, t); + } + //验签 + try { + PublicKey publicKey = getPublicKeyFromCertPath(pubKeyPath); + boolean verifyResult = verifySignature(sr.getPlainText(), + signature, publicKey); + sr.setVerifyPass(verifyResult); + } catch (Exception e) { + String msg = "验签失败"; + logger.error(msg); + throw new Exception(msg, e); + } + return sr; + } + + private static boolean verifySignature(String plainText, String signature, PublicKey publicKey) throws Exception { + if (plainText == null || signature == null) { + return true; + } + logger.debug("签名明文:" + plainText); + logger.debug("签名:" + signature); + //验签 + SignatureUtil2 signatureUtil = new SignatureUtil2(); + signatureUtil.setSm2WithZFlag(true); + SM2PublicKey pubKey = (SM2PublicKey) publicKey; + + boolean verifyResult = signatureUtil.p1VerifyMessage(signAlg, + plainText.getBytes(charset), signature.getBytes(charset), pubKey, + session); + logger.debug("验签结果:" + String.valueOf(verifyResult)); + return verifyResult; + } + + + /** + * 从文件路径读取sm2文件。首先从缓存中查找是否有该文件路径的文件,若有则直接取出。若无则从文件系统中读取,并写入缓存。 + * + * @param sm2FilePath + * @param sm2FilePwd + * @return + * @throws Exception + * @function + */ + private static PrivateKey getPrivateKeyFromSM2Path(String sm2FilePath, String sm2FilePwd) throws Exception { + + String sm2FileData = readFileToString(sm2FilePath, charset); + PrivateKey priKey; + try { + priKey = KeyUtil.getPrivateKeyFromSM2(sm2FileData.getBytes(charset), sm2FilePwd); + } catch (Throwable t) { + String errMsg = "私钥文件加载失败。sm2FilePath=" + sm2FilePath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + return priKey; + + } + + private static X509Cert getX509CertFromSm2Path(String sm2Path) throws Exception { + X509Cert cert; + try { + cert = CertUtil.getCertFromSM2(sm2Path); + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。sm2Path=" + sm2Path; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + + + return cert; + + } + + /** + * 从文件路径读取公钥。首先从缓存中查找是否有该文件路径的文件,若有则直接取出。若无则从文件系统中读取,并写入缓存。 + * + * @param certPath + * @return + * @throws Exception + * @function + */ + private static PublicKey getPublicKeyFromCertPath(String certPath) throws Exception { + + PublicKey publicKey; + String certData = readFileToString(certPath, charset); + try { + X509Cert cert = X509CertHelper.parse(certData.getBytes()); + publicKey = cert.getPublicKey(); + + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。certPath=" + certPath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + return publicKey; + + } + + private static String readFileToString(String fileName, String encoding) { + File file = new File(fileName); + if (!file.exists()) { + throw new RuntimeException(fileName + "文件不存在"); + } + try { + return FileUtils.readFileToString(file, encoding); + } catch (IOException e) { + throw new RuntimeException(fileName + "读取文件失败", e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java new file mode 100644 index 0000000..108506e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java @@ -0,0 +1,136 @@ +package org.dromara.settlement.common.bank.minsheng; + +import cmbc.cfca.sm2rsa.common.Mechanism; +import cmbc.cfca.sm2rsa.common.PKIException; +import cmbc.cfca.util.CertUtil; +import cmbc.cfca.util.EnvelopeUtil; +import cmbc.cfca.util.KeyUtil; +import cmbc.cfca.util.SignatureUtil2; +import cmbc.cfca.util.cipher.lib.JCrypto; +import cmbc.cfca.util.cipher.lib.Session; +import cmbc.cfca.x509.certificate.X509Cert; +import cmbc.cfca.x509.certificate.X509CertHelper; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.security.PrivateKey; + + +/** + * 联调外联平台 用 bankcersm2.cer和corp.sm2 ,仅可用于加密 和 解密外联平台传输过来的文件和报文 + */ +public class FileEncryptAndDecryptUtil { + /** + * 以下用到的文件或存放文件的目录需提前建好,否则报错 + */ + public static void main(String[] args) { + + /*String path = Thread.currentThread().getContextClassLoader().getResource("file/mhtText.txt").getPath(); + + File file = new File(path); + String path1 = file.getPath(); + String name = file.getName(); + String filePath = path1.substring(0, path1.length() - name.length()); + // 商户私钥 + String sm2MhtPriCertPath = Thread.currentThread().getContextClassLoader().getResource(TestDemo.SM2_MERCHANT_PRIVATE_CERT_NAME).getPath(); + //银行公钥 + String sm2CmbcPubCertPath = Thread.currentThread().getContextClassLoader().getResource(TestDemo.SM2_CMBC_PUBLIC_CERT_NAME).getPath(); + String sm2Psword = TestDemo.SM2_MERCHANT_PRIVATE_CERT_PSWORD; + try { + //加密 + encryptFile(name, filePath, sm2MhtPriCertPath, sm2Psword, sm2CmbcPubCertPath); + //解密 + String encryptedFileName = "CMBC_LOAN_20230219.csv"; + decryptFile(encryptedFileName, filePath, sm2MhtPriCertPath, sm2Psword); + } catch (Exception e) { + e.printStackTrace(); + }*/ + } + + /** + * 文件加签加密 + * a.商户使用商户私钥对文件进行签名 + * b.商户使用银行公钥对签名后的文件进行加密(测试环境请用 corp.sm2和bankcersm2.cer) + * + * @param fileName 要加密的文件名 + * @param filePath 要加密的文件所在路径 + * @param sm2MhtPriCertPath 商户sm2私钥证书路径 + * @param sm2MhtPriCertPsword 商户sm2私钥证书密码 + * @param sm2CmbcPubCertPath 民生sm2 公钥证书路径 + * @throws Exception + */ + public static void encryptFile(String fileName, String filePath, String sm2MhtPriCertPath, String sm2MhtPriCertPsword, String sm2CmbcPubCertPath) throws Exception { + + //商户加密 + + // 签名 + X509Cert mhtSM2Cert = CertUtil.getCertFromSM2(sm2MhtPriCertPath); + PrivateKey mhtPriKey = KeyUtil.getPrivateKeyFromSM2(sm2MhtPriCertPath, sm2MhtPriCertPsword); + + // 待加密文件路径 + String sourceFilePath = filePath + fileName; + //签名后文件路径 + String signFilePath = filePath + "\\sign\\" + fileName; + //加密后文件路径 + String encryptFilePath = filePath + "\\encrypt\\" + fileName; + Session session = getSession(); + + SignatureUtil2 signatureUtil2 = new SignatureUtil2(); + // SM2签名包含Z值 + signatureUtil2.setSm2WithZFlag(true); + String signAlg = Mechanism.SM3_SM2; + signatureUtil2.p7SignFileAttach(signAlg, sourceFilePath, signFilePath, mhtPriKey, mhtSM2Cert, session); + + //加密 + X509Cert bankX509Cert = X509CertHelper.parse(FileUtils.readFileToByteArray(new File(sm2CmbcPubCertPath))); + X509Cert[] bankCertArr = new X509Cert[]{bankX509Cert}; + String encryptAlgrithm = Mechanism.SM4_CBC; + EnvelopeUtil.envelopeFile(signFilePath, encryptFilePath, encryptAlgrithm, bankCertArr, session); + + } + + /** + * 文件解密验签 + * a.商户使用银行公钥对文件进行解密 + * b.对文件进行验签(测试环境请用 corp.sm2和bankcersm2.cer) + * + * @param encryptFileName 要解密验签的文件 + * @param filePath 要加密的文件所在路径 + * @param sm2MhtPriCertPath 商户sm2私钥证书路径 + * @param sm2Psword 商户sm2私钥证书密码 + * @param outSourceFilePath 验签后文件路径--解密验签后的明文路径 + * @throws Exception + */ + public static String decryptFile(String encryptFileName, String filePath, String sm2MhtPriCertPath, String sm2Psword,String outSourceFilePath) throws Exception { + String encryptFilePath = filePath + encryptFileName; + // 解密后待验签文件路径 + String veryfiSignFilePath = filePath + "veryfiSign" + encryptFileName; + // 银行私钥 + SignatureUtil2 signatureUtil2 = new SignatureUtil2(); + // 解密 + Session session = getSession(); + + PrivateKey mhtPriKey = KeyUtil.getPrivateKeyFromSM2(sm2MhtPriCertPath, sm2Psword); + X509Cert mhtRcvX509Cert = CertUtil.getCertFromSM2(sm2MhtPriCertPath); + EnvelopeUtil.openEnvelopedFile(encryptFilePath, veryfiSignFilePath, mhtPriKey, mhtRcvX509Cert, session); + + // 校验 + boolean verifyResult = signatureUtil2.p7VerifyFileAttach(veryfiSignFilePath, outSourceFilePath, session); + System.out.println("验签结果:" + verifyResult); + new File(veryfiSignFilePath).delete(); + return outSourceFilePath; + } + + /** + * 获取Session + * + * @return + * @throws PKIException + */ + private static Session getSession() throws PKIException { + String deviceName = JCrypto.JSOFT_LIB; + JCrypto.getInstance().initialize(deviceName, null); + Session session = JCrypto.getInstance().openSession(deviceName); + return session; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java new file mode 100644 index 0000000..f3e3090 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java @@ -0,0 +1,74 @@ +package org.dromara.settlement.common.bank.minsheng; + +public class MinShengConfig { + /* + 商户号 + */ + public String merchantNum = "0009848835_"; + + /* + 系统编码 + */ + public String systemCode = "00003_"; + + /* + 接口URL + */ + public String URL = "https://ecptest.cmbc.com.cn:10061/ecp/httpMhtInFwd_"; + + /* + ssl证书 + */ + public String rsaCertPath = "cert/RSA_2048.pfx"; + /* + ssl证书密码 + */ + public String rsaCertPsword = "test123456"; + /* + 商户SM2私钥证书 + */ + public String sm2MhtPriCertPath = "cert/corp.sm2"; + /* + 商户SM2私钥证书密码 + */ + public String sm2MhtPriCertPsword = "test123456"; + /* + 银行公钥 + */ + public String sm2CmbcPubCert = "cert/bankcersm2.cer"; + + /** + * 安全开关 + */ + public Boolean securitySwitch = true; + + /** + * 是否走https + */ + public Boolean isSSL = true; + + /** + * 实账户账号 + */ + public String acctNo; + + /** + * 客户签约编码 + */ + public String customerSignId; + + /** + * 产品编码 + */ + public String productCode; + + public String CALLBACKHOST = "218.28.196.178_"; + + public String CALLBACKPORT = "12022_"; + + public String CALLBACKNAME = "jiaotong_"; + + public String CALLBACKPASSWORD = "jichai@2022_"; + + public String CALLBACKDIRECTORY = "home"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java new file mode 100644 index 0000000..62b2115 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.common.bank.minsheng; + +public interface MinShengConstants { + public static final String VERSION_02 = "02"; + public static final String DEFAULT_CHARSET = "utf-8"; + public static String CHANNEL_TYPE = "WG00"; + public static String TRANSL_TYPE = "000010"; + + public static final String TRANSCODE = "transCode"; + public static final String TRANSTYPE = "transType"; + public static final String VERSION = "version"; + public static final String REQ_SEQ = "reqSeq"; + public static final String REQ_TIME = "reqTime"; + public static final String TRANS_DATE = "transDate"; + public static final String TRANS_TIME = "transTime"; + public static final String CHARSET = "charset"; + public static final String MERCHANT_NUM = "merchantNum"; + public static final String SYSTEM_CODE = "systemCode"; + public static final String REMARK = "remark"; + public static final String RESERVE = "reserve"; + public static final String RESERVE2 = "reserve2"; + public static final String SGNTR = "sgntr"; + public static final String PRODUCT_CODE = "productCode"; + + public static final String BODY = "body"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java new file mode 100644 index 0000000..f98bb39 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java @@ -0,0 +1,179 @@ +package org.dromara.settlement.common.bank.minsheng; + +import com.alibaba.fastjson.JSONObject; +import org.dom4j.Element; + +public class MinShengResponse { + private String reqid; + private String resultcode; + private String resultmsg; + private JSONObject data; + + private String transCode; // 交易码 + private String reqSeq; // 请求方流水号 + private String respSeq; // 响应方流水号 + private String merchantNum; //客户识别号 + private String txTime; // 账务交易时间 + private String respDate; // 交易日期 + private String respTime; // 响应时间 + private String respStatus; // 响应结果状态 + private String respCode; // 响应错误码 + private String respDesc; // 响应错误信息 + private String charset; // 参数编码字符集 + private String remark; // 备注 + private String reserve; // 备用字段 + private String reserve2; // 原样返回 + private String sgntr; // 签名 + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getReqSeq() { + return reqSeq; + } + + public void setReqSeq(String reqSeq) { + this.reqSeq = reqSeq; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public JSONObject getData() { + return data; + } + + public void setData(JSONObject data) { + this.data = data; + } + + public String getTransCode() { + return transCode; + } + + public void setTransCode(String transCode) { + this.transCode = transCode; + } + + public String getRespSeq() { + return respSeq; + } + + public void setRespSeq(String respSeq) { + this.respSeq = respSeq; + } + + public String getMerchantNum() { + return merchantNum; + } + + public void setMerchantNum(String merchantNum) { + this.merchantNum = merchantNum; + } + + public String getTxTime() { + return txTime; + } + + public void setTxTime(String txTime) { + this.txTime = txTime; + } + + public String getRespTime() { + return respTime; + } + + public void setRespTime(String respTime) { + this.respTime = respTime; + } + + public String getRespStatus() { + return respStatus; + } + + public void setRespStatus(String respStatus) { + this.respStatus = respStatus; + } + + public String getRespCode() { + return respCode; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public String getRespDesc() { + return respDesc; + } + + public void setRespDesc(String respDesc) { + this.respDesc = respDesc; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getReserve() { + return reserve; + } + + public void setReserve(String reserve) { + this.reserve = reserve; + } + + public String getReserve2() { + return reserve2; + } + + public void setReserve2(String reserve2) { + this.reserve2 = reserve2; + } + + public String getSgntr() { + return sgntr; + } + + public void setSgntr(String sgntr) { + this.sgntr = sgntr; + } + + public String getRespDate() { + return respDate; + } + + public void setRespDate(String respDate) { + this.respDate = respDate; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java new file mode 100644 index 0000000..ab93da3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java @@ -0,0 +1,254 @@ +package org.dromara.settlement.common.bank.minsheng; + +import com.alibaba.fastjson.JSONObject; + +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.alibaba.nacos.shaded.com.google.gson.GsonBuilder; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLDecoder; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.*; + +public class MinShengUtil { + private static final Logger log = LoggerFactory.getLogger(MinShengUtil.class); + + private static class SingletonHolder { + private static final MinShengUtil INSTANCE = new MinShengUtil(); + } + + /** + * 初始化状态 + */ + private static boolean sslInited = false; + private static SSLConnectionSocketFactory sslsf; + + private MinShengUtil() { + + } + + public static final MinShengUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + System.out.println(5%2); + } + + private void initSSL(String clientKeyStoryPath, String clientKeyStoryPassword) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException { + //构造SSL环境 + SSLContext sslContext = SSLContext.getInstance("SSL"); + //keyStore类型,JKS、pkcs12 + KeyStore keyStore = KeyStore.getInstance("pkcs12"); + //创建jks密钥访问库 + if (null != clientKeyStoryPassword && null != clientKeyStoryPath && clientKeyStoryPassword.length() > 0 && clientKeyStoryPath.length() > 0) { + keyStore.load(new FileInputStream(clientKeyStoryPath), clientKeyStoryPassword.toCharArray()); + } else { + throw new RuntimeException("SSL认证证书路径或密码为空。"); + } + //创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码 + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); + keyManagerFactory.init(keyStore, clientKeyStoryPassword.toCharArray()); + //只允许使用TLSv1协议 + sslContext.init(keyManagerFactory.getKeyManagers(), null, null); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1"}, null, ignoreHostnameVerifier); + } + + public Result request(MinShengConfig config, String transCode, String reqid, String body) { + // AES加密 + String request = ""; + String res = ""; + CloseableHttpClient httpclient = null; + CloseableHttpResponse response = null; + try { + List params = null; + boolean securitySwitch = config.securitySwitch == null || config.securitySwitch; + //加密和加签 + if (securitySwitch) { + EcpSecurityResult sr = EcpSecurityUtil.encryptAndSign(body, config.sm2MhtPriCertPath, config.sm2MhtPriCertPsword, + config.sm2CmbcPubCert); + // 组装form表单数据 + params = getRequestForm(reqid,transCode,sr.getSignature(), sr.getCipherText(), config); + } else { + params = getRequestForm(reqid,transCode,null, body, config); + } + // 是否使用https + boolean isSSL = config.isSSL; + if (isSSL) { + if (!sslInited) { + initSSL(config.rsaCertPath, config.rsaCertPsword); + } + httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } else { + httpclient = HttpClients.custom().build(); + } + HttpPost httpPost = new HttpPost(config.URL); + RequestConfig httpConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000) + .setConnectionRequestTimeout(60000).build(); + httpPost.setConfig(httpConfig); + UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, MinShengConstants.DEFAULT_CHARSET); + httpPost.setEntity(reqEntity); + try { + StringWriter writer = new StringWriter(); + IOUtils.copy(reqEntity.getContent(), writer, "utf-8"); + request = URLDecoder.decode(writer.toString(), "UTF-8"); + } catch (IOException e) { + log.error("民生银行api参数解析出错:", e); + } + log.info("request: (" + config.URL+"),"+request); + response = httpclient.execute(httpPost); + if(response == null){ + throw new RuntimeException("发送请求后返回报文为空"); + } + HttpEntity respEntity = response.getEntity(); + if (respEntity != null) { + res = EntityUtils.toString(respEntity, MinShengConstants.DEFAULT_CHARSET); + } + log.info("response: " + res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("民生银行api调用出错(" + JSONObject.toJSONString(config) + "," + transCode + "," + reqid + "," + body + + "):", e); + } finally { + try { + if (null != response) { + response.close(); + } + if (null != httpclient) { + httpclient.close(); + } + } catch (IOException e) { + log.error("民生银行api调用时IO出错(" + JSONObject.toJSONString(config) + "," + transCode + "," + reqid + "," + body + + "):", e); + } + } + Result rtn = new Result(); + rtn.setResult(request); + rtn.setRtnData(res); + return rtn; + } + + public Result response(MinShengConfig config, String response) { + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + Gson gson = new GsonBuilder().create(); + Map headMap = gson.fromJson(response, Map.class); + if (headMap == null) { + rtn.addError("响应内容不能为空"); + return rtn; + } + MinShengResponse data = new MinShengResponse(); + data.setTransCode(headMap.get("transCode")); + data.setReqSeq(headMap.get("reqSeq")); + data.setRespSeq(headMap.get("respSeq")); + data.setMerchantNum(headMap.get("merchantNum")); + data.setTxTime(headMap.get("txTime")); + data.setRespDate(headMap.get("respDate")); + data.setRespTime(headMap.get("respTime")); + data.setRespStatus(headMap.get("respStatus")); + data.setRespDesc(headMap.get("respDesc")); + data.setRespCode(headMap.get("respCode")); + data.setCharset(headMap.get("charset")); + data.setRemark(headMap.get("remark")); + data.setReserve(headMap.get("reserve")); + data.setReserve2(headMap.get("reserve2")); + data.setSgntr(headMap.get("sgntr")); + String body = headMap.get("body"); + if (StringUtils.isNotEmpty(body)){ + String bodyJson = body; + if (config.securitySwitch) { + //log.debug("开始解密验签。密文:" + body); + EcpSecurityResult sr = EcpSecurityUtil.decryptAndVerify(body, data.getSgntr(), + config.sm2MhtPriCertPath, config.sm2MhtPriCertPsword, config.sm2CmbcPubCert); + if (StringUtils.isEmpty(sr.getCipherText())) { + rtn.addError("解密失败"); + return rtn; + } + if (!sr.isVerifyPass()) { + rtn.addError("验签失败"); + return rtn; + } + bodyJson = sr.getPlainText(); + } + data.setData(JSONObject.parseObject(bodyJson)); + } + data.setReqid(data.getReqSeq()); + data.setResultcode(data.getRespStatus()); + data.setResultmsg(data.getRespDesc() + "("+data.getRespCode()+")"); + rtn.setRtnData(data); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析民生银行响应出错(" + JSONObject.toJSONString(config) + "," + response + "):", e); + } + return rtn; + } + + /** + * 封装请求的form表单 + * + * @param sgntr + * @param body + * @param clientConfig + * @return + */ + private List getRequestForm( + String reqid, String transCode,String sgntr, String body, MinShengConfig clientConfig) { + List form = new ArrayList(); + form.add(new BasicNameValuePair(MinShengConstants.TRANSCODE, transCode)); + form.add(new BasicNameValuePair(MinShengConstants.PRODUCT_CODE, clientConfig.productCode)); + form.add(new BasicNameValuePair(MinShengConstants.MERCHANT_NUM, clientConfig.merchantNum)); + form.add(new BasicNameValuePair(MinShengConstants.SYSTEM_CODE, clientConfig.systemCode)); + form.add(new BasicNameValuePair(MinShengConstants.TRANSTYPE, MinShengConstants.TRANSL_TYPE)); + form.add(new BasicNameValuePair(MinShengConstants.VERSION, MinShengConstants.VERSION_02)); + form.add(new BasicNameValuePair(MinShengConstants.REQ_SEQ, reqid)); + String reqTime = new SimpleDateFormat("yyyyMMddHHmmssSSS") + .format(new Date(System.currentTimeMillis())); + form.add(new BasicNameValuePair(MinShengConstants.REQ_TIME, reqTime)); + form.add(new BasicNameValuePair(MinShengConstants.TRANS_DATE, reqTime.substring(0, 8))); + form.add(new BasicNameValuePair(MinShengConstants.TRANS_TIME, reqTime.substring(8, 17))); + form.add(new BasicNameValuePair(MinShengConstants.CHARSET, MinShengConstants.DEFAULT_CHARSET)); + + form.add(new BasicNameValuePair(MinShengConstants.REMARK, "")); + form.add(new BasicNameValuePair(MinShengConstants.RESERVE, "")); + form.add(new BasicNameValuePair(MinShengConstants.RESERVE2, "")); + + form.add(new BasicNameValuePair(MinShengConstants.SGNTR, sgntr)); + form.add(new BasicNameValuePair(MinShengConstants.BODY, body)); + return form; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java new file mode 100644 index 0000000..775f6ee --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java @@ -0,0 +1,138 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import java.io.ByteArrayInputStream; +import java.math.BigInteger; +import java.util.Enumeration; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.ASN1InputStream; +import org.bouncycastle.asn1.ASN1Integer; +import org.bouncycastle.asn1.ASN1Sequence; +import org.bouncycastle.asn1.DERSequence; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPrivateKeyParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.params.ParametersWithID; +import org.bouncycastle.crypto.signers.SM2Signer; +import org.bouncycastle.jce.ECNamedCurveTable; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECPoint; + +public class DCCryptor { + + // sm4-cbc 加密 + public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception { + if (key == null || iv == null || input == null) { + throw new Exception("CMBSM4EncryptWithCBC 非法输入"); + } + return CMBSM4Crypt(key, iv, input, 1); + } + + // sm4-cbc解密 + public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception { + if (key == null || iv == null || input == null) { + throw new Exception("CMBSM4DecryptWithCBC 非法输入"); + } + return CMBSM4Crypt(key, iv, input, 2); + } + + // 签名 + public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception { + if (privkey == null || msg == null) { + throw new Exception("CMBSM2SignWithSM3 input error"); + } + ECPrivateKeyParameters privateKey = encodePrivateKey(privkey); + SM2Signer signer = new SM2Signer(); + ParametersWithID parameters = new ParametersWithID(privateKey, id); + signer.init(true, parameters); + signer.update(msg, 0, msg.length); + return decodeDERSignature(signer.generateSignature()); + } + + // 验签 + public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception { + + if (pubkey == null || msg == null || signature == null) { + throw new Exception("CMBSM2VerifyWithSM3 input error"); + } + ECPublicKeyParameters publicKey = encodePublicKey(pubkey); + SM2Signer signer = new SM2Signer(); + ParametersWithID parameters = new ParametersWithID(publicKey, id); + signer.init(false, parameters); + signer.update(msg, 0, msg.length); + return signer.verifySignature(encodeDERSignature(signature)); + } + + private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception { + SecretKeySpec spec = new SecretKeySpec(key, "SM4"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME); + cipher.init(mode, spec, ivParameterSpec); + return cipher.doFinal(input); + } + + private static ECPrivateKeyParameters encodePrivateKey(byte[] value) { + BigInteger d = new BigInteger(1, value); + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1"); + ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed()); + return new ECPrivateKeyParameters(d, ecParameters); + } + + private static ECPublicKeyParameters encodePublicKey(byte[] value) { + byte[] x = new byte[32]; + byte[] y = new byte[32]; + System.arraycopy(value, 1, x, 0, 32); + System.arraycopy(value, 33, y, 0, 32); + BigInteger X = new BigInteger(1, x); + BigInteger Y = new BigInteger(1, y); + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1"); + ECPoint Q = spec.getCurve().createPoint(X, Y); + ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed()); + return new ECPublicKeyParameters(Q, ecParameters); + } + + private static byte[] decodeDERSignature(byte[] signature) throws Exception { + ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature)); + ASN1Sequence primitive = (ASN1Sequence) stream.readObject(); + Enumeration enumeration = primitive.getObjects(); + BigInteger R = ((ASN1Integer) enumeration.nextElement()).getValue(); + BigInteger S = ((ASN1Integer) enumeration.nextElement()).getValue(); + byte[] bytes = new byte[64]; + byte[] r = format(R.toByteArray()); + byte[] s = format(S.toByteArray()); + System.arraycopy(r, 0, bytes, 0, 32); + System.arraycopy(s, 0, bytes, 32, 32); + return bytes; + } + + private static byte[] encodeDERSignature(byte[] signature) throws Exception { + byte[] r = new byte[32]; + byte[] s = new byte[32]; + System.arraycopy(signature, 0, r, 0, 32); + System.arraycopy(signature, 32, s, 0, 32); + ASN1EncodableVector vector = new ASN1EncodableVector(); + vector.add(new ASN1Integer(new BigInteger(1, r))); + vector.add(new ASN1Integer(new BigInteger(1, s))); + return (new DERSequence(vector)).getEncoded(); + } + + private static byte[] format(byte[] value) { + if (value.length == 32) { + return value; + } else { + byte[] bytes = new byte[32]; + if (value.length > 32) { + System.arraycopy(value, value.length - 32, bytes, 0, 32); + } else { + System.arraycopy(value, 0, bytes, 32 - value.length, value.length); + } + return bytes; + } + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java new file mode 100644 index 0000000..325dd69 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java @@ -0,0 +1,204 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import com.alibaba.nacos.shaded.com.google.gson.JsonArray; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeSet; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + + +public class DCHelper { + + public static String serialJsonOrdered(JsonObject json) throws Exception { + StringBuilder appender = new StringBuilder(); + appender.append("{"); + Iterator keys = new TreeSet<>(json.keySet()).iterator(); + boolean isFirstEle = true; + while (keys.hasNext()) { + if (!isFirstEle) { + appender.append(","); + } + String key = keys.next(); + Object val = json.get(key); + if (val instanceof JsonObject) { + appender.append("\"").append(key).append("\":"); + appender.append(serialJsonOrdered((JsonObject) val)); + } else if (val instanceof JsonArray) { + JsonArray jarray = (JsonArray) val; + appender.append("\"").append(key).append("\":["); + boolean isFirstArrEle = true; + for (int i = 0; i < jarray.size(); i++) { + if (!isFirstArrEle) { + appender.append(","); + } + Object obj = jarray.get(i); + if (obj instanceof JsonObject) { + appender.append(serialJsonOrdered((JsonObject) obj)); + } else { + appender.append(obj.toString()); + } + isFirstArrEle = false; + } + appender.append("]"); + } else { + String value = val.toString(); +// if (val instanceof JsonPrimitive) { +// value = val.toString(); +// } else { +// value = replaceSlash(val.toString()); +// } + appender.append("\"").append(key).append("\":").append(value); + } + isFirstEle = false; + } + appender.append("}"); + return appender.toString(); + } + + public static String getTime() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + return dateFormat.format(new Date()); + } + + // 发送Post请求 + public static String doPostForm(String httpUrl, Map param) throws Exception { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + URL url = new URL(httpUrl); + SSLContext sslcontext; + sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[] { new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } }, new java.security.SecureRandom()); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + // 新建连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置为POST请求 + connection.setRequestMethod("POST"); + // 设置连接超时时长 + connection.setConnectTimeout(15000); + // 设置读取超时 + connection.setReadTimeout(60000); + connection.setInstanceFollowRedirects(true); + + connection.setDoOutput(true); + connection.setDoInput(true); + + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + os = connection.getOutputStream(); + os.write(createLinkString(param).getBytes()); + if (connection.getResponseCode() != 200) { + is = connection.getErrorStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + // 获取错误返回 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } else { + is = connection.getInputStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + // 获取返回 + boolean firstLine = true; + while ((temp = br.readLine()) != null) { + if (!firstLine) { + firstLine = false; + sbf.append("\r\n"); + } + sbf.append(temp); + } + result = sbf.toString(); + } + } finally { + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 关闭连接 + connection.disconnect(); + } + return result; + } + + private static String createLinkString(Map params) throws Exception { + ArrayList keys = new ArrayList<>(params.keySet()); + Collections.sort(keys); + + StringBuilder prestr = new StringBuilder(); + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = params.get(key); + if (i == keys.size() - 1) { + prestr.append(key).append("=").append(value); + } else { + prestr.append(key).append("=").append(value).append("&"); + } + } + return prestr.toString(); + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java new file mode 100644 index 0000000..c6df6d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java @@ -0,0 +1,44 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +public class ZhaoShangConfig { + public String pubkeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Ec7viMyQC5SShRz1jP0IQRLLVGDQ4f1rgZwtxT4ZOgnWxUoAHquj2yIrgFjNpWVnt/1dJGtXWkpp2UN3jMI5ubjVQkL0OFD+8r0IFXYAARsCLAwVLF0LE487KvVRaQC7A7rPlFfBtE/v++KajzMuDauNlIASYobcFKYdZ89vIfE/xMg/44QJqQ2XBkoMnJ7ul0kMdh4YWOQnO0qqvXD2eK3KPaXMRtxieGsVBgsvtETprw98bTl9tPUBUrneyirrccS8/Z6raV6nioyx2RzrMld8YnjlnV2YTJpNAlG+y/wLoKY55Rkjcvg9wSe8qbI/VtYVQfQz8gfeUzFQTKKCwIDAQAB"; + public String prikeyStr = "MIIEowIBAAKCAQEAwN7xTseqQs1pNA/+gTgXRqcxCYfkxDTsckfqf3O2ndsvJS5T" + + "8Fb0oHTyjy0HjrKLASWWUKfhQGXPHbo1FQd+0TyHxSza55+HtXquUq7QsAITHCu3" + + "U7aslvC7xe6/2E7nhu1TausF1nSyB1o4xVEjZyjrdQpTID0JvG8BtA5Yem9YDBCM" + + "ZHBxvarQHVqdBsqo2G3M09qeUDbY3DuBgdiVAw0ApIM8mKGj4jsWmRSnypuxl40B" + + "jWAr6Xgk44MpSGHndhiFXGvfMRRYEd8Z30w32QlB+Gjk8rQwXnvxG8YCBPYqXVkq" + + "wld81bHFFz5zHQ0qekPhD8RrFimPn+RaD9VNfwIDAQABAoIBAQCxUUZQw0hJOkgq" + + "UToO2t6rWjK/LGyp5m4rcuqoWl3eKxDhAgKxx4AHtPz7nM6B5qvdVg0oAfAZIICW" + + "OAdtWgLBowC/yklHAWfm9O8nnQjHiGDBWX+mOx/ZdWFsy98cow5BAhfbCE/Jpme2" + + "UsA2yC3gPcKbS+64iOVWlEfgnf/CLte/dE0eAMfsp5wXpwv3ygA4wtyd2X2P+y6s" + + "+WYBKSvNMS08W4dsxwU9Q3AG3hS0Uab09qIPNS8tEMZ2L1tl0/VvkrAYjayM1CcK" + + "CrSnwtH6eJVi4WQxL1K3QxyxDKucsOlqSHg++4VMpGZNpvstn3IsY3PyCgfsODvH" + + "aoygvDBhAoGBAPxxdcI9stK9bIGSms0FqbVXYj8WmAjE/M9B7ECToWRQg65Gf8MY" + + "PyUSkY2mbDHwf+yPsUb5Oli+a2GW8BwmJWeXEIy0lQxa1TS2b7CN6XJtZVnjEgiZ" + + "d7bXy/j69r/C4CMlfbrRWnUGftKr/U7ynaGs10/bISeW12E7WdLV5+kDAoGBAMOW" + + "nEzAFMPFzG9p/GtYpWU5jMNSiakzfm6n9Nwr7dFGnLhVGtO6act1bm/WB26NAgIE" + + "ArhcitoKrI346nfkoZLXBpzzyJgFx4r31d1RN9Vsrt6AEywlwnLwHk2HXtCwmqre" + + "hZ4I741S2rHlaT8ifNwLyjW2sbw9QnpC3RL7R3rVAoGAOI/Dbs4cLxO6KB4NCTrn" + + "l3YI0VHiprRcYKPIp39sfel8V6P8JF5eZ5QNgMt1GotkXkCj298jr5aawLbs/aGe" + + "Z+N1FdGwQ6BmfPUTeV+SmszgFI/IDp00MYeQcCzq9HRZfAZ+cUlPF0FpURKwIuxB" + + "XWQ4qe/TMeeeQm7l5VOALrkCgYAljLa5LW9PHpxfD3P8j+pBAsl5flEbgN1XFTu3" + + "QV/I+8t+wCgEWheRjhwDsI2AteWayXZUOsAVmFMEdrNdDTHP5SRJ4auzM/jZPzd5" + + "4+vaN6Fi6ifEJAOu2VaX/9M+MYmgIFR6wLBs62k9GhQYoOBjxoetxENfJkuq+UdE" + + "K6XPeQKBgFvf+SUrg7hFpRRyCq+DehdMQk1TJnEPTNLOalfrA/319KA8LGa0Q+ay" + + "5c2mDc9F//yAJEAT1WTEqHnvKBQvjofFAGRntoCT8anAnskSytwwpltKqDcpoKx/" + + "hVK+eVL47wuFroCBLGj0Zm3I7S+saGGmVllEky4jceE7IMTN7i6W"; + + public String UID = "N002466952"; + public String ACCNBR = "755915707610905"; + //static String URL = "http://99.11.2.154:8080/cdcserver/api/v2"; + public String URL = "http://183.62.66.60:9080/cdcserver/api/v2"; + //static String URL = "http://99.12.250.6:9080/cdcserver/api/v2"; + public String AESKEY = "YSqdwE8vAQ1BcfYCpESUsnVzOOMA2ZSd"; + public String BBKNBR = "37"; + + //开户行 + public String KHH =""; + //联行号 + public String LHH = ""; + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java new file mode 100644 index 0000000..46fb087 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java @@ -0,0 +1,46 @@ +package org.dromara.settlement.common.bank.zhaoshang; + + +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; + +public class ZhaoShangResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private JsonObject data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public JsonObject getData() { + return data; + } + + public void setData(JsonObject data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java new file mode 100644 index 0000000..858fe80 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java @@ -0,0 +1,141 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.HashMap; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.GsonBuilder; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.service.impl.ZhaoShangServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class ZhaoShangUtil { + private static final Logger log = LoggerFactory.getLogger(ZhaoShangUtil.class); + + private static class SingletonHolder { + private static final ZhaoShangUtil INSTANCE = new ZhaoShangUtil(); + } + + private ZhaoShangUtil() { + Security.addProvider(new BouncyCastleProvider()); + } + + public static final ZhaoShangUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + new ZhaoShangServiceImpl().createAccount(0,"1", "1", "1"); + } + + public Result request(ZhaoShangConfig config, String funcode, String reqid, JsonObject body) { + // AES加密 + String AesPlainxt = ""; + String res = ""; + try { + JsonObject jObject = new JsonObject(); + JsonObject head = new JsonObject(); + head.addProperty("funcode", funcode); + head.addProperty("userid", config.UID); + head.addProperty("reqid", reqid); + JsonObject request = new JsonObject(); + request.add("body", body); + request.add("head", head); + jObject.add("request", request); + + JsonObject object = new JsonObject(); + // 签名 + object.addProperty("sigdat", "__signature_sigdat__"); + // object.put("sigtim", GetTime()); + + object.addProperty("sigtim", DCHelper.getTime()); + jObject.add("signature", object); + String source = DCHelper.serialJsonOrdered(jObject); + log.info("签名原文: " + source); + //String data = signRsa2048(getPrivateKeyFromBytes(config.prikeyStr, "PKCS"),source.getBytes()); + String data = new String(java.util.Base64.getEncoder().encode(DCCryptor.CMBSM2SignWithSM3(getID_IV(config.UID), java.util.Base64.getDecoder().decode(config.prikeyStr), source.getBytes(StandardCharsets.UTF_8)))); + log.info("签名结果: " + data); + object.addProperty("sigdat", data); + //jObject.put("signature", object); + + AesPlainxt = DCHelper.serialJsonOrdered(jObject); + log.info("加密前req: " + AesPlainxt); + //String req = encryptAES256Str(AesPlainxt, config.AESKEY.getBytes()); + String req = new String(java.util.Base64.getEncoder().encode(DCCryptor.CMBSM4EncryptWithCBC(config.AESKEY.getBytes(), getID_IV(config.UID), AesPlainxt.getBytes(StandardCharsets.UTF_8)))); + log.info("加密后req: " + req); + + // 发送请求 + HashMap map = new HashMap<>(); + map.put("UID", config.UID); + map.put("DATA", URLEncoder.encode(req, "utf-8")); + map.put("FUNCODE", funcode); + map.put("ALG", "SM"); + res = DCHelper.doPostForm(config.URL, map); + log.info("res: " + res); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + log.error("招商银行api调用出错("+ JSONObject.toJSONString(config)+","+funcode+","+reqid+","+JSONObject.toJSONString(body)+"):",e); + } + Result rtn = new Result(); + rtn.setResult(AesPlainxt); + rtn.setRtnData(res); + return rtn; + } + + public Result response(ZhaoShangConfig config,String response){ + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + //String resplain = decryptAES256(response, config.AESKEY.getBytes(), true); + String resplain = new String(DCCryptor.CMBSM4DecryptWithCBC(config.AESKEY.getBytes(), getID_IV(config.UID), java.util.Base64.getDecoder().decode(response)), StandardCharsets.UTF_8); + rtn.setResult(response); + log.info("res decrypt: " + resplain); + JsonObject object2 = new GsonBuilder().create().fromJson(resplain, JsonObject.class); + JsonObject object3 = object2.getAsJsonObject("signature"); + String resSign = object3.get("sigdat").getAsString(); + object3.addProperty("sigdat", "__signature_sigdat__"); + object2.add("signature", object3); + String resSignSource = DCHelper.serialJsonOrdered(object2); + log.info("验签原文: " + resSignSource); + rtn.setResult(resSignSource); + log.info("验签签名值: " + resSign); + //Boolean verify = signRsa2048Verify(resSignSource.getBytes(), Base64.decode(resSign), getPublicKeyFromBytes(config.pubkeyStr)); + Boolean verify = DCCryptor.CMBSM2VerifyWithSM3(getID_IV(config.UID), java.util.Base64.getDecoder().decode(config.pubkeyStr), resSignSource.getBytes(StandardCharsets.UTF_8), java.util.Base64.getDecoder().decode(resSign)); + log.info("验签结果: " + verify); + if (verify) { + JsonObject responseObj = object2.getAsJsonObject("response"); + JsonObject responseHead = responseObj.getAsJsonObject("head"); + ZhaoShangResponse data = new ZhaoShangResponse(); + data.setData(responseObj.getAsJsonObject("body")); + data.setReqid(responseHead.get("reqid").getAsString()); + data.setResultcode(responseHead.get("resultcode").getAsString()); + data.setResultmsg(responseHead.get("resultmsg").getAsString()); + rtn.setRtnData(data); + }else { + rtn.addError("验签失败"); + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析招商银行响应出错("+JSONObject.toJSONString(config)+","+response+"):",e); + } + return rtn; + } + + private byte[] getID_IV(String uid) { + String userid = uid + "0000000000000000"; + return userid.substring(0, 16).getBytes(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java new file mode 100644 index 0000000..55fe8b8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java @@ -0,0 +1,12 @@ +package org.dromara.settlement.common.bank.zhifubao; + +public class ZhiFuBaoConfig { + public String prikeyStr = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCLD+qSMzvkMZHb9iNr2haC3OsDt1noDagXDa1NYYyV2DJ3wo3CnBPz6JP/T0+yJ9nh+XQzTjw/LApVLhTcgVOgdG4QYVPJTuTJ9DSVWK5QQ77ceDdOQdiC6gps2Ic0DocTBKOPcZltvtOtbeUxKM0wiPH01yjYyYAWRAeN/Y54LnjN49z6WhVWvU+nSYpov9Z9Gec+o1enetOsLh+zBsNWuBYzm9VkEVcsDs4FFqVz9OjSh6anjMbbq8HhFJYko5gzt7Vxj5HfAxo0m3AIO8Ua1HG8oAEYbt5cv+bUV5c5waYv05Vl+/wMQ+xfvWIsZkXQIpsLEygNL2A0zODCAXBpAgMBAAECggEBAIYTY3NwSFdcX6g3KbGrxLaJb2HW3q04tY78ldGcsuIqX4ZOI0W2HBq3bDHlcw5vE8inLZzl2nqB6Lh1xJFRc6KpfxD19cWK9lWsySIRLYefuZ5xnckq/ShDpKeLINhVBXCVsWj0+xvvt8FnymlaUHNyJe6NoAlcRc2x66LADCPcI5inM6anAhoLLWnw1ufFnrnAzMjzhqDIvp4GyLQMM6vYhVs9wyeCcX5nwsgOBmQZZCWyNc6FyX4lljsMStaUEv6wvHe9WQoTDpXgjPxFShN8iT45mMotoU2MdYa9kcy3396R0Xw9I2KPv4ly0GxTlBvaRk72VUP4UkHuGeRVJbECgYEA1vcJw6tLEO1rCz1v6GKObdHhJmWYERh9ejcQ77trO8e6ICjJDrJLh9YLXa28B1xVcXK/iXSwH9ViFk5Cukj+bSZK12LRUf1tkHwjQ+DzUy15JYEJCs2w33GjpWOhPkYqbcFxken02/WxPQu1T+eY5xfQ345sxeGvt3zZr1cG060CgYEApZuj/YQv2e+FX+f/5k4czRQwYoXI/9fPJyrkwW6GzJ+r0BCWjbWegbG93Lwijjv9YNf1ee4CR0Ga30m0cx64vAPN2tWx+XgTUS7BZz2iQavLF0sRI1ZKjBtzCrIxE4tw5CSGoWsjiB1mL+3ZG3cLYUZUZ9sHwWgQ0nnbEkKmhy0CgYEAqdQBotRxOa5YI0kmYDF81MY7WlppCRiQCT33423uCgyAv2d5cGLrySURVbEsG6SW3EoLiEzn2D58f6LUlNeWKiVWe1NWi6/sH3nzYm0Vz2DdlQOcYSyfz+e3obJUcR595rgtQVnUWPKCU/gsBjSyV+A45GVhCfSDHjNEx4G5owECgYB/y3wf7Tqz1aa5nKEXit2kz9iKnqy96T5c/jeqoOz6yJhgJfzX+/gGIy/dP3z2/4oGioBOiAFQFWs6tXi/gUyTIehf35nIZgWaFxd94MzuGnDNV8sw1q0OMzxyW5GNgIQsOZd+xtuTdQRfJg7sp8+rUAdgYWA5umGI2inYjIBPPQKBgQCydWm0nzMKC7grS44OH/gPd/l61TAP/ktqfyJDMzoZ9x8/LQidr218IEWiIxGPT80QKTiXbmwgNR55FNQvx8BLvBc+vsmQGteV1fgocC8/RJ3cxH3DF/TH4DWrPechz8nAi3GVlsLe2xwJI1A+vr6/Y5OVtphRPgn84h3jr1lW+w=="; + public String APPID = "2021003144629727"; + public String accName = ""; + public String URL = "https://openapi.alipay.com/gateway.do"; + public String alipayCertPublicKey = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/alipayCertPublicKey_RSA2.crt"; + public String alipayRootCert = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/alipayRootCert.crt"; + public String appCertPublicKey = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/appCertPublicKey_2021003144629727.crt"; + public String notifyUrl = "https://notify.jichaihr.com/"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java new file mode 100644 index 0000000..ea24369 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java @@ -0,0 +1,45 @@ +package org.dromara.settlement.common.bank.zhifubao; + +import com.alipay.api.AlipayResponse; + +public class ZhiFuBaoResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private AlipayResponse data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public AlipayResponse getData() { + return data; + } + + public void setData(AlipayResponse data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java new file mode 100644 index 0000000..84580a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java @@ -0,0 +1,62 @@ +package org.dromara.settlement.common.bank.zhifubao; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alipay.api.AlipayRequest; +import com.alipay.api.AlipayResponse; +import com.alipay.api.CertAlipayRequest; +import com.alipay.api.DefaultAlipayClient; + +public class ZhiFuBaoUtil { + private static final Logger log = LoggerFactory.getLogger(ZhiFuBaoUtil.class); + + private static class SingletonHolder { + private static final ZhiFuBaoUtil INSTANCE = new ZhiFuBaoUtil(); + } + + private ZhiFuBaoUtil() { + } + + public static final ZhiFuBaoUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public Result request(ZhiFuBaoConfig config, AlipayRequest request, boolean isPage) { + Result rtn = new Result(); + try { + CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); + certAlipayRequest.setServerUrl(config.URL); + certAlipayRequest.setAppId(config.APPID); + certAlipayRequest.setPrivateKey(config.prikeyStr); + certAlipayRequest.setFormat("JSON"); + certAlipayRequest.setCharset("UTF-8"); + certAlipayRequest.setSignType("RSA2"); + certAlipayRequest.setCertPath(config.appCertPublicKey); + certAlipayRequest.setAlipayPublicCertPath(config.alipayCertPublicKey); + certAlipayRequest.setRootCertPath(config.alipayRootCert ); + DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + String reqStr = JSONObject.toJSONString(request); + log.info("req: " + reqStr); + rtn.setResult(reqStr); + AlipayResponse response = null; + if (isPage) { + response = alipayClient.pageExecute(request,"get"); + }else { + response = alipayClient.certificateExecute(request); + } + log.info("res: " + JSONObject.toJSONString(response)); + ZhiFuBaoResponse res = new ZhiFuBaoResponse(); + res.setData(response); + res.setResultcode(response.getCode()); + res.setResultmsg(response.getMsg()); + rtn.setRtnData(res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝api调用出错("+JSONObject.toJSONString(config)+","+JSONObject.toJSONString(request)+"):",e); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java new file mode 100644 index 0000000..bfba9f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java @@ -0,0 +1,100 @@ +package org.dromara.settlement.common.file; + +import org.dromara.common.core.utils.StringUtils; + +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Base64; + + +public class FileUtils { + public static String base64ToFile(String base64, String fileName, String savePath) { + File file = null; + // 创建文件目录 + String filePath = savePath; + File dir = new File(filePath); + if (!dir.exists() && !dir.isDirectory()) { + dir.mkdirs(); + } + BufferedOutputStream bos = null; + java.io.FileOutputStream fos = null; + try { + byte[] bytes = Base64.getDecoder().decode(base64); + filePath = filePath + fileName; + file = new File(filePath); + fos = new java.io.FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(bytes); + } catch (Exception e) { + e.printStackTrace(); + filePath = ""; + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return filePath; + } + + /** + * 读取txt文件 + * @author 张涛 + * @date 2022年8月3日 + * @param filePath + * @param rowSeparator 行分隔符 + * @return + */ + public static String readTxtFile(String filePath,String rowSeparator) { + + File file = new File(filePath); + if(file.isFile() && file.exists()){ + if(StringUtils.isBlank(rowSeparator)) { + rowSeparator = ""; + } + FileInputStream fileInputStream = null; + InputStreamReader inputStreamReader = null; + BufferedReader bufferedReader = null; + try { + fileInputStream = new FileInputStream(file); + inputStreamReader = new InputStreamReader(fileInputStream); + bufferedReader = new BufferedReader(inputStreamReader); + StringBuffer sb = new StringBuffer(); + String text = null; + while((text = bufferedReader.readLine()) != null){ + sb.append(text+rowSeparator); + } + return sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + }finally { + try { + if(bufferedReader != null) + bufferedReader.close(); + if(inputStreamReader != null) + inputStreamReader.close(); + if(fileInputStream != null) + fileInputStream.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java new file mode 100644 index 0000000..a6e7025 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java @@ -0,0 +1,225 @@ +package org.dromara.settlement.common.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.Iterator; +import java.util.Properties; +import java.util.Vector; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.ChannelSftp.LsEntry; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +/** + * SFTP上传下载文件 + */ +public class SftpUtils { + private final Logger logger = LoggerFactory.getLogger(SftpUtils.class);// SnowLog.getLogger(this.getClass()); + + /** + * 连接sftp服务器 + * @param host 主机 + * @param port 端口 + * @param username 用户名 + * @param password 密码 + * @return + */ + public ChannelSftp connect(String host, int port, String username, String password) { + ChannelSftp sftp = null; + Channel channel=null; + Session sshSession=null; + try { + JSch jsch = new JSch(); + jsch.getSession(username, host, port); + sshSession = jsch.getSession(username, host, port); + if(logger.isInfoEnabled()){ + logger.info("***************** Session created. **********************"); + logger.info("***************** stf host is "+host+"port is "+port+" username is "+username+" password is "+password+"**********************"); + } + sshSession.setPassword(password); + Properties sshConfig = new Properties(); + sshConfig.put("StrictHostKeyChecking", "no"); + sshSession.setConfig(sshConfig); + sshSession.connect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Session connected. **********************"); + logger.info("***************** Opening Channel. **********************"); + } + channel = sshSession.openChannel("sftp"); + channel.connect(); + sftp = (ChannelSftp) channel; + if(logger.isInfoEnabled()){ + logger.info("***************** Connected to " + host + ". **********************"); + } + } catch (Throwable e) { + if (channel!=null) { + try { + channel.disconnect(); + }catch(Throwable e1) { + } + } + + if (sshSession!=null) { + try { + sshSession.disconnect(); + }catch(Throwable e1) { + } + } + + logger.error(e.getMessage(), e); + } + return sftp; + } + + /** + * 关闭连接 + * @param sftp + */ + public void disconnect(String host, ChannelSftp sftp){ + // 关闭连接 + try { + if (null != sftp) { + sftp.disconnect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Closing Channel. **********************"); + } + if (null != sftp.getSession()) { + sftp.getSession().disconnect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Session disconnect. **********************"); + } + } + } + if (logger.isInfoEnabled()) { + logger.info("**************** Disconnect to " + host + ". *******************"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 判断目录下是否存在文件或者文件夹 + * @param directory + * @param fileName + * @param sftp + * @return + */ + public boolean isExist(String directory, String fileName, ChannelSftp sftp) { + try { + Vector v = listFiles(directory, sftp); + Iterator it = v.iterator(); + while (it.hasNext()) { + LsEntry entry = it.next(); + String flName = entry.getFilename(); + if (flName.equals(fileName)) { + return true; + } + } + } catch (SftpException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 上传文件 + * @param directory 上传的目录 + * @param uploadFile 要上传的文件 + * @param sftp + */ + public String upload(String directory, String uploadFile, ChannelSftp sftp) { + String successFlg = "0"; + try { + sftp.cd(directory); + File file = new File(uploadFile); + sftp.put(new FileInputStream(file), file.getName()); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + } catch (Exception e) { + successFlg = "1"; + e.printStackTrace(); + } + return successFlg; + } + + /** + * 下载文件 + * @param directory 下载目录 + * @param downloadFile 下载的文件 + * @param saveFile 存在本地的路径 + * @param sftp + */ + public boolean download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) { + try { + sftp.cd(directory); + File file = new File(saveFile); + if(!file.getParentFile().exists()){ + file.getParentFile().mkdirs(); + } + sftp.get(downloadFile, new FileOutputStream(file)); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * 删除文件 + * @param directory 要删除文件所在目录 + * @param deleteFile 要删除的文件 + * @param sftp + */ + public void delete(String directory, String deleteFile, ChannelSftp sftp) { + try { + sftp.cd(directory); + sftp.rm(deleteFile); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + if (null != sftp) { + sftp.disconnect(); + if (null != sftp.getSession()) { + sftp.getSession().disconnect(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 列出目录下的文件 + * @param directory 要列出的目录 + * @param sftp + * @return + * @throws SftpException + */ + @SuppressWarnings("unchecked") + public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException { + return sftp.ls(directory); + } + + /** + * 判断本地路径是否存在,不存在就创建路径 + */ + public void makeDirs(String localSavePath) { + File localFile = new File(localSavePath); + if (!localFile.exists()) { + localFile.mkdirs(); + } + } +} + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java new file mode 100644 index 0000000..b0dbbfa --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java @@ -0,0 +1,291 @@ +package org.dromara.settlement.common.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +/** + * 压缩(实现的Zip)工具 + */ +public class ZipUtils { + + /********************************** 压缩start ***************************************/ + /** + * 压缩文件-由于out要在递归调用外,所以封装一个方法用来 调用ZipFiles(ZipOutputStream out,String + * path,File... srcFiles) + * + * @param zip + * @param path + * @param srcFiles + * @throws IOException + */ + public static void zipFiles(File zip, File... srcFiles) throws IOException { + String path = ""; + ZipOutputStream out = null; + try { + out = new ZipOutputStream(new FileOutputStream(zip)); + ZipFiles(out, path, srcFiles); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } finally { + if (out != null) + out.close(); + } + System.out.println("*****************压缩完毕*******************"); + } + + public static void zipFiles(String zip, List srcFilePaths) + throws IOException { + File zipFile = new File(zip); + File[] srcFiles = new File[srcFilePaths.size()]; + for (int i = 0, len = srcFilePaths.size(); i < len; i++) { + srcFiles[i] = new File(srcFilePaths.get(i)); + } + zipFiles(zipFile, srcFiles); + } + + /** + * 压缩文件-File + * + * @param zipFile + * zip文件 + * @param srcFiles + * 被压缩源文件 + */ + private static void ZipFiles(ZipOutputStream out, String path, + File... srcFiles) { + path = path.replaceAll("\\*", "/"); + if (!path.endsWith("/")) { + path += "/"; + } + byte[] buf = new byte[1024]; + FileInputStream in = null; + try { + for (File srcFile : srcFiles) { + if (srcFile.isDirectory()) { + File[] files = srcFile.listFiles(); + out.putNextEntry(new ZipEntry(path)); + ZipFiles(out, path, files); + } else { + in = new FileInputStream(srcFile); + System.out.println(path + srcFile.getName()); + out.putNextEntry(new ZipEntry(path + srcFile.getName())); + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + out.closeEntry(); + in.close(); + in = null; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + } + } + } + + /********************************** 压缩end ***************************************/ + + /********************************** 解压缩start ***************************************/ + /** + * 解压到指定目录 + * + * @param zipPath + * @param descDir + */ + public static void unZipFiles(String zipPath, String descDir) + throws IOException { + unZipFiles(new File(zipPath), descDir); + } + + /** + * 解压文件到指定目录 + * + * @param zipFile + * @param descDir + */ + private static void unZipFiles(File zipFile, String descDir) + throws IOException { + File pathFile = new File(descDir); + if (!pathFile.exists()) { + pathFile.mkdirs(); + } + ZipFile zip = new ZipFile(zipFile); + for (Enumeration entries = zip.entries(); entries.hasMoreElements();) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + String zipEntryName = entry.getName(); + InputStream in = zip.getInputStream(entry); + String outPath = (descDir + zipEntryName).replaceAll("\\*", "/"); + ; + // 判断路径是否存在,不存在则创建文件路径 + File file = new File(outPath.substring(0, outPath.lastIndexOf('/'))); + if (!file.exists()) { + file.mkdirs(); + } + // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 + if (new File(outPath).isDirectory()) { + continue; + } + // 输出文件路径信息 + System.out.println(outPath); + + OutputStream out = new FileOutputStream(outPath); + byte[] buf1 = new byte[1024]; + int len; + while ((len = in.read(buf1)) > 0) { + out.write(buf1, 0, len); + } + in.close(); + out.close(); + } + zip.close(); + System.out.println("******************解压完毕********************"); + } + + /********************************** 解压缩end ***************************************/ + + /** + * 解压缩一个文件 + * + * @param zipFile + * 压缩文件 + * @param folderPath + * 解压缩的目标目录 + * @throws IOException + * 当解压缩过程出错时抛出 + */ + public static void upZipFile(File zipFile, String folderPath) + throws ZipException, IOException { + File desDir = new File(folderPath); + if (!desDir.exists()) { + desDir.mkdirs(); + } + ZipFile zf = new ZipFile(zipFile); + for (Enumeration entries = zf.entries(); entries.hasMoreElements();) { + ZipEntry entry = ((ZipEntry) entries.nextElement()); + InputStream in = zf.getInputStream(entry); + String str = folderPath + File.separator + entry.getName(); + str = new String(str.getBytes("8859_1"), "GB2312"); + File desFile = new File(str); + if (!desFile.exists()) { + File fileParentDir = desFile.getParentFile(); + if (!fileParentDir.exists()) { + fileParentDir.mkdirs(); + } + desFile.createNewFile(); + } + OutputStream out = new FileOutputStream(desFile); + byte buffer[] = new byte[1024 * 1024]; + int realLength; + while ((realLength = in.read(buffer)) > 0) { + out.write(buffer, 0, realLength); + } + out.close(); + in.close(); + } + zf.close(); + } + + /** 第一个参数是压缩文件路径,第二个参数是要解压的文件夹路径,文件夹可以不存在会自动生成 */ + public static void ZipDecompress(String frompath, String topath) + throws IOException { + ZipFile zf = new ZipFile(new File(frompath)); + InputStream inputStream; + Enumeration en = zf.entries(); + while (en.hasMoreElements()) { + ZipEntry zn = (ZipEntry) en.nextElement(); + if (!zn.isDirectory()) { + inputStream = zf.getInputStream(zn); + File f = new File(topath + zn.getName()); + File file = f.getParentFile(); + file.mkdirs(); + System.out.println(zn.getName() + "---" + zn.getSize()); + + FileOutputStream outputStream = new FileOutputStream(topath + + File.separator + zn.getName()); + int len = 0; + byte bufer[] = new byte[1024]; + while (-1 != (len = inputStream.read(bufer))) { + outputStream.write(bufer, 0, len); + } + outputStream.close(); + } + } + zf.close(); + } + + /** + * 解压文件名包含传入文字的文件 + * + * @param zipFile + * 压缩文件 + * @param folderPath + * 目标文件夹 + * @param nameContains + * 传入的文件匹配名 + * @throws ZipException + * 压缩格式有误时抛出 + * @throws IOException + * IO错误时抛出 + */ + public static ArrayList upZipSelectedFile(File zipFile, + String folderPath, String nameContains) throws ZipException, + IOException { + ArrayList fileList = new ArrayList(); + + File desDir = new File(folderPath); + if (!desDir.exists()) { + desDir.mkdir(); + } + + ZipFile zf = new ZipFile(zipFile); + for (Enumeration entries = zf.entries(); entries.hasMoreElements();) { + ZipEntry entry = ((ZipEntry) entries.nextElement()); + if (entry.getName().contains(nameContains)) { + InputStream in = zf.getInputStream(entry); + String str = folderPath + File.separator + entry.getName(); + str = new String(str.getBytes("8859_1"), "GB2312"); + // str.getBytes("GB2312"),"8859_1" 输出 + // str.getBytes("8859_1"),"GB2312" 输入 + File desFile = new File(str); + if (!desFile.exists()) { + File fileParentDir = desFile.getParentFile(); + if (!fileParentDir.exists()) { + fileParentDir.mkdirs(); + } + desFile.createNewFile(); + } + OutputStream out = new FileOutputStream(desFile); + byte buffer[] = new byte[1024 * 1024]; + int realLength; + while ((realLength = in.read(buffer)) > 0) { + out.write(buffer, 0, realLength); + } + in.close(); + out.close(); + fileList.add(desFile); + } + } + return fileList; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java new file mode 100644 index 0000000..8192ac6 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java @@ -0,0 +1,234 @@ +package org.dromara.settlement.common.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; + +/** + * + * @ClassName: GCMD5Util + * @Description:TODO(完成密码MD5的加密) + * @author: Chivalrous + * @date: 2012-11-23 下午3:57:08 + */ +public class GCMD5Util { + private static final Logger log = LoggerFactory.getLogger(GCMD5Util.class); + private static final String HEX_NUMS_STR = "0123456789ABCDEF"; + private static final Integer SALT_LENGTH = 12; + + /** + * 将16进制字符串转换成字节数组 + * + * @param hex + * @return + */ + public static byte[] hexStringToByte(String hex) { + int len = (hex.length() / 2); + byte[] result = new byte[len]; + char[] hexChars = hex.toCharArray(); + for (int i = 0; i < len; i++) { + int pos = i * 2; + result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR + .indexOf(hexChars[pos + 1])); + } + return result; + } + + /** + * 将指定byte数组转换成16进制字符串 + * + * @param b + * @return + */ + public static String byteToHexString(byte[] b) { + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + String hex = Integer.toHexString(b[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + hexString.append(hex.toUpperCase()); + } + return hexString.toString(); + } + + /** + * 验证口令是否合法 + * + * @param password + * @param passwordInDb + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static boolean validPassword(String password, String passwordInDb) { + try { + // 将16进制字符串格式口令转换成字节数组 + byte[] pwdInDb = hexStringToByte(passwordInDb); + // 声明盐变量 + byte[] salt = new byte[SALT_LENGTH]; + // 将盐从数据库中保存的口令字节数组中提取出来 + System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH); + // 创建消息摘要对象 + MessageDigest md = MessageDigest.getInstance("MD5"); + // 将盐数据传入消息摘要对象 + md.update(salt); + // 将口令的数据传给消息摘要对象 + md.update(password.getBytes("UTF-8")); + // 生成输入口令的消息摘要 + byte[] digest = md.digest(); + // 声明一个保存数据库中口令消息摘要的变量 + byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH]; + // 取得数据库中口令的消息摘要 + System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, + digestInDb.length); + // 比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同 + if (Arrays.equals(digest, digestInDb)) { + // 口令正确返回口令匹配消息 + return true; + } else { + // 口令不正确返回口令不匹配消息 + return false; + } + } catch (Exception e) { + log.error(e.getMessage()); + log.error("对比数据中的MD5摘要和传入校验的进行匹配失败!"); + return false; + } + } + + /** + * 获得加密后的16进制形式口令 + * + * @param password + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static String getEncryptedPwd(String password) + throws NoSuchAlgorithmException, UnsupportedEncodingException { + // 声明加密后的口令数组变量 + byte[] pwd = null; + // 随机数生成器 + SecureRandom random = new SecureRandom(); + // 声明盐数组变量 + byte[] salt = new byte[SALT_LENGTH]; + // 将随机数放入盐变量中 + random.nextBytes(salt); + + // 声明消息摘要对象 + MessageDigest md = null; + // 创建消息摘要 + md = MessageDigest.getInstance("MD5"); + // 将盐数据传入消息摘要对象 + md.update(salt); + // 将口令的数据传给消息摘要对象 + md.update(password.getBytes("UTF-8")); + // 获得消息摘要的字节数组 + byte[] digest = md.digest(); + + // 因为要在口令的字节数组中存放盐,所以加上盐的字节长度 + pwd = new byte[digest.length + SALT_LENGTH]; + // 将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐 + System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); + // 将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节 + System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); + // 将字节数组格式加密后的口令转化为16进制字符串格式的口令 + return byteToHexString(pwd); + } + + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })) + .byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })) + .byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + public static byte[] HexString2Bytes(String src) { + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < src.length() / 2; i++) { + ret[i] = uniteBytes(tmp[(i * 2)], tmp[(i * 2 + 1)]); + } + return ret; + } + + public static String byte2MD5(byte[] src) { + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + return ""; + } + byte[] md5Bytes = md5.digest(src); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = md5Bytes[i] & 0xFF; + if (val < 16) + hexValue.append("0"); + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } + + /** + * 对字符串md5加密 + * + * @param str + * @return + */ + public static String getMD5(String encStr) { + char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(encStr.getBytes("UTF-8")); + byte[] md = mdTemp.digest(); + int j = md.length; + char str[] = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + return null; + } + } + + public static String string2MD5(String inStr) { + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + return ""; + } + char[] charArray = inStr.toCharArray(); + byte[] byteArray = new byte[charArray.length]; + + for (int i = 0; i < charArray.length; i++) + byteArray[i] = (byte) charArray[i]; + byte[] md5Bytes = md5.digest(byteArray); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = md5Bytes[i] & 0xFF; + if (val < 16) + hexValue.append("0"); + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java new file mode 100644 index 0000000..fb75df5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java @@ -0,0 +1,24 @@ +package org.dromara.settlement.common.http; + + +/** + * http结果bean + * @author 张涛 + * @date 2016年11月2日 + */ +public class HttpResultData{ + /** 状态返回码*/ + private String code; + /** + * 状态返回码 + * @author 张涛 + * @date 2016年11月2日 + * @return + */ + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java new file mode 100644 index 0000000..08a81c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java @@ -0,0 +1,200 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.StatusLine; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.InputStream; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.security.*; +import java.security.cert.CertificateException; + + +public class HttpUtil { + + /** + * 微信退款 + * 发送xml请求到server端 + * @param url xml请求数据地址 + * @param xmlString 发送的xml数据流 + * @return null发送失败,否则返回响应内容 + * @throws KeyStoreException + * @throws NoSuchAlgorithmException + * @throws UnrecoverableKeyException + * @throws KeyManagementException + * @throws IOException + * @throws CertificateException + */ + public static String httpXMLRefundPost(String url,String xmlString,String matchid) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException{ + + //指定读取证书格式为PKCS12 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + //读取本机存放的PKCS12证书文件 + InputStream instream = HttpUtil.class.getResourceAsStream("/config/apiclient_cert.p12"); + try { + //指定PKCS12的密码(商户ID) + keyStore.load(instream,matchid.toCharArray()); + } finally { + instream.close(); + } + SSLContext sslcontext = SSLContexts.custom() + .loadKeyMaterial(keyStore, matchid.toCharArray()).build(); + //指定TLS版本 + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + sslcontext,new String[] { "TLSv1" },null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + HttpPost httpPost = null; + StringBuilder reponseXml = new StringBuilder(); + try { + // 定义HttpPost请求 + httpPost = new HttpPost(url); + // 定义请求实体 + HttpEntity requestEntity = new StringEntity(xmlString, "UTF-8"); + httpPost.setEntity(requestEntity); + + // 定义HttpClient + //设置httpclient的SSLSocketFactory + CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + + + + // 以post方式发送Http请求 + HttpResponse httpResponse = httpclient.execute(httpPost); + + // 获取响应实体 + HttpEntity responsetEntity = httpResponse.getEntity(); + InputStream inputStream = responsetEntity.getContent(); + + + byte[] b = new byte[2048]; + int length = 0; + while ((length = inputStream.read(b)) != -1) { + reponseXml.append(new String(b, 0, length)); + } + System.out.println(reponseXml); + } catch (Exception e) { + //释放请求的连接 + if(httpPost!=null){ + httpPost.abort(); + } + + if(SocketTimeoutException.class.isInstance(e)){ + throw new RuntimeException("Http请求响应超时",e); + } + else if(ConnectTimeoutException.class.isInstance(e)){ + throw new RuntimeException("Http请求连接超时", e); + } + else if(ConnectException.class.isInstance(e)){ + throw new RuntimeException("Http请求异常", e); + }else{ + throw new RuntimeException("其他异常", e); + } + } + + return reponseXml.toString(); + } + + + /** + * post请求(用于请求json格式的参数) + * @param url + * @param params + * @return + */ + public static String doPost(String url, String params) throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url);// 创建httpPost + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Content-Type", "application/json"); + String charSet = "UTF-8"; + StringEntity entity = new StringEntity(params, charSet); + httpPost.setEntity(entity); + CloseableHttpResponse response = null; + try { + response = httpclient.execute(httpPost); + StatusLine status = response.getStatusLine(); + int state = status.getStatusCode(); + if (state == HttpStatus.SC_OK) { + HttpEntity responseEntity = response.getEntity(); + String jsonString = EntityUtils.toString(responseEntity); + return jsonString; + } + else{ + + } + } + finally { + if (response != null) { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * get请求(用于请求json格式的参数) + * @param url + * @param params + * @return + */ + public static String doGet(String url) + { + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url);// 创建HttpGet + httpGet.setHeader("Accept", "application/json"); + httpGet.setHeader("Content-Type", "application/json"); + CloseableHttpResponse response = null; + try { + response = httpclient.execute(httpGet); + StatusLine status = response.getStatusLine(); + int state = status.getStatusCode(); + if (state == HttpStatus.SC_OK) { + HttpEntity responseEntity = response.getEntity(); + String jsonString = EntityUtils.toString(responseEntity); + return jsonString; + } + } + catch(Exception e) + { + e.printStackTrace(); + } + finally { + if (response != null) { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java new file mode 100644 index 0000000..435554e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java @@ -0,0 +1,29 @@ +package org.dromara.settlement.common.http; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // TODO 自动生成的方法存根 + + } + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // TODO 自动生成的方法存根 + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO 自动生成的方法存根 + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java new file mode 100644 index 0000000..bf435d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java @@ -0,0 +1,108 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; +import org.apache.http.impl.nio.client.HttpAsyncClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 异步请求线程 + * @author 张涛 + * @date 2017年4月11日 + */ +public class SynRequestThread extends Thread{ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + public SynRequestThread(){ + synClient = HttpAsyncClients.custom().setMaxConnTotal(1000).setMaxConnPerRoute(1000).build(); + synReqOpen = new CountDownLatch(1); + synReqCount = new AtomicInteger(0); + synClient.start(); + status = 1; + log.debug(":SynRequestThread synClient初始化了"); + } + + /** + * 异步请求客户端 + */ + private CloseableHttpAsyncClient synClient; + + /** + * 当前异步请求数量 + */ + public AtomicInteger synReqCount = null; + + /** + * 异步请求结束开关(计数器) + */ + public CountDownLatch synReqOpen = null; + + private int status = 0;//0:已结束 1:运行中 + + + + @Override + public void run() { + // TODO 自动生成的方法存根 + try { + log.debug(":SynRequestThread synThread开始执行了"); + synReqOpen.await(); + status = 0; + log.debug(":SynRequestThread synClient请求发送完毕了"); + synClient.close(); + log.debug(":SynRequestThread synThread释放了"); + //System.out.println("异步请求释放了"); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放线程失败:",e); + } + } + + /** + * 是否正在运行 + * @author 张涛 + * @date 2017年12月2日 + * @return + */ + public boolean isRunning(){ + return status == 1 && synClient != null && synClient.isRunning(); + } + + /** + * 释放锁 + * @author 张涛 + * @date 2017年12月4日 + */ + public void close(){ + if (status == 1) {//请求未发送完毕 + log.debug(":SynRequestThread close时剩余请求数量" + "("+synReqCount.get()+")"); + synReqOpen.countDown(); + } + } + + /** + * 发送请求 + * @author 张涛 + * @date 2017年4月11日 + * @param postMethod + */ + public void sendRequest(HttpPost postMethod){ + //System.out.println("异步请求+1"); + try { + synReqCount.incrementAndGet(); + synClient.execute(postMethod,new SynResponse(this,postMethod)); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("发送异步请求失败("+postMethod.getURI()+"):",e); + int num = synReqCount.decrementAndGet(); + if (num <= 0){ + synReqOpen.countDown(); + log.debug(":SynRequestThread请求完毕了,计数为0了,释放线程"); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java new file mode 100644 index 0000000..4b7610a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java @@ -0,0 +1,54 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.concurrent.FutureCallback; + +/** + * 异步请求回调 + * @author 张涛 + * @date 2016年12月11日 + */ +public class SynResponse implements FutureCallback{ + private HttpPost postMethod; + /** + * 异步请求线程 + */ + private SynRequestThread synThread; + + public SynResponse(SynRequestThread synThread,HttpPost postMethod){ + this.synThread = synThread; + this.postMethod = postMethod; + } + + @Override + public void completed(HttpResponse paramT) { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + @Override + public void cancelled() { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + @Override + public void failed(Exception paramException) { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + /** + * 释放连接 + * @author 张涛 + * @date 2017年4月10日 + */ + private void releaseConnection(){ + if(postMethod != null) + postMethod.releaseConnection(); + int num = synThread.synReqCount.decrementAndGet(); + if (num <= 0) + synThread.synReqOpen.countDown(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java new file mode 100644 index 0000000..b577f4f --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java @@ -0,0 +1,66 @@ +package org.dromara.settlement.controller; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.dromara.common.web.core.BaseController; +import org.dromara.settlement.service.IPublicService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/public") +public class ZhiFuBaoController extends BaseController { + + private final IPublicService publicService; + + /** + * 支付宝充值通知 + * + * @param msg + * @return + * @author 张涛 + * @date 2022年8月25日 + */ + public String zfbNotify(HttpServletRequest request) { + return publicService.zfbNotify(getParamMap(request)); + } + + /** + * 支付宝签约通知 + * + * @param request + * @return + * @author 张涛 + * @date 2022年8月29日 + */ + public String signNotify(HttpServletRequest request) { + return publicService.signNotify(getParamMap(request)); + } + + private Map getParamMap(HttpServletRequest request) { + Map params = new HashMap(); + Enumeration paramNames = request.getParameterNames(); + while (paramNames.hasMoreElements()) { + String paramName = paramNames.nextElement(); + String[] paramValues = request.getParameterValues(paramName); + if (paramValues.length > 0) { + params.put(paramName, paramValues[0]); + } else { + params.put(paramName, ""); + } + } + return params; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java new file mode 100644 index 0000000..6d9c1f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java @@ -0,0 +1,62 @@ +package org.dromara.settlement.domain; + +import java.io.Serializable; + + +/** + * 选择项bean + * @author 张涛 + * @date 2016年5月30日 + */ +public class SelectData implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 4496625459732466108L; + + public SelectData(){} + + + + public SelectData(String value, String text) { + this.value = value; + this.text = text; + } + + + + private String value; + + private String text; + + /** + * 选项值 + * @author 张涛 + * @date 2016年10月10日 + * @return + */ + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 选项描述 + * @author 张涛 + * @date 2016年10月10日 + * @return + */ + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java new file mode 100644 index 0000000..6fccf29 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java @@ -0,0 +1,75 @@ +package org.dromara.settlement.domain; + +import java.util.Date; + +public class SysLog { + private Long id; + + private String reqid; + + private String request; + + private String response; + + private Date requestTime; + + private Date responseTime; + + private Long tranId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public String getRequest() { + return request; + } + + public void setRequest(String request) { + this.request = request; + } + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public Date getRequestTime() { + return requestTime; + } + + public void setRequestTime(Date requestTime) { + this.requestTime = requestTime; + } + + public Date getResponseTime() { + return responseTime; + } + + public void setResponseTime(Date responseTime) { + this.responseTime = responseTime; + } + + public Long getTranId() { + return tranId; + } + + public void setTranId(Long tranId) { + this.tranId = tranId; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java new file mode 100644 index 0000000..018f5c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java @@ -0,0 +1,145 @@ +package org.dromara.settlement.domain; + +import java.util.Date; + +public class SysUnitConfig extends SysUnitConfigKey { + private Integer confUnitType; + + private String confValue; + + private String confGroup; + + private Integer confGroupSort; + + private String confGroupName; + + private Integer confSort; + + private String confRemark; + + private Integer confIsEditor; + + private Date updateTime; + + private String updateBy; + + private String className; + + private String classAlias; + + private Integer isEnable; + + private Integer classSort; + + public Integer getConfUnitType() { + return confUnitType; + } + + public void setConfUnitType(Integer confUnitType) { + this.confUnitType = confUnitType; + } + + public String getConfValue() { + return confValue; + } + + public void setConfValue(String confValue) { + this.confValue = confValue; + } + + public String getConfGroup() { + return confGroup; + } + + public void setConfGroup(String confGroup) { + this.confGroup = confGroup; + } + + public Integer getConfGroupSort() { + return confGroupSort; + } + + public void setConfGroupSort(Integer confGroupSort) { + this.confGroupSort = confGroupSort; + } + + public String getConfGroupName() { + return confGroupName; + } + + public void setConfGroupName(String confGroupName) { + this.confGroupName = confGroupName; + } + + public Integer getConfSort() { + return confSort; + } + + public void setConfSort(Integer confSort) { + this.confSort = confSort; + } + + public String getConfRemark() { + return confRemark; + } + + public void setConfRemark(String confRemark) { + this.confRemark = confRemark; + } + + public Integer getConfIsEditor() { + return confIsEditor; + } + + public void setConfIsEditor(Integer confIsEditor) { + this.confIsEditor = confIsEditor; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getClassAlias() { + return classAlias; + } + + public void setClassAlias(String classAlias) { + this.classAlias = classAlias; + } + + public Integer getIsEnable() { + return isEnable; + } + + public void setIsEnable(Integer isEnable) { + this.isEnable = isEnable; + } + + public Integer getClassSort() { + return classSort; + } + + public void setClassSort(Integer classSort) { + this.classSort = classSort; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java new file mode 100644 index 0000000..b15d1a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java @@ -0,0 +1,23 @@ +package org.dromara.settlement.domain; + +public class SysUnitConfigKey { + private String confItem; + + private Long confUnit; + + public String getConfItem() { + return confItem; + } + + public void setConfItem(String confItem) { + this.confItem = confItem; + } + + public Long getConfUnit() { + return confUnit; + } + + public void setConfUnit(Long confUnit) { + this.confUnit = confUnit; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java new file mode 100644 index 0000000..9e463c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java @@ -0,0 +1,52 @@ +package org.dromara.settlement.domain.qiniu; + +import java.io.Serializable; + +/** + * 七牛图片信息 + * @author zhangtao + * + */ +public class ImageInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 6140518322901971437L; + private String format; + private int width; + private int height; + private String colorModel; + private String url; + public String getFormat() { + return format; + } + public void setFormat(String format) { + this.format = format; + } + public int getWidth() { + return width; + } + public void setWidth(int width) { + this.width = width; + } + public int getHeight() { + return height; + } + public void setHeight(int height) { + this.height = height; + } + public String getColorModel() { + return colorModel; + } + public void setColorModel(String colorModel) { + this.colorModel = colorModel; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java new file mode 100644 index 0000000..7605c86 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java @@ -0,0 +1,213 @@ +package org.dromara.settlement.domain.qiniu; + +import java.io.Serializable; + +/** + * 千牛上传文件,上传策略 + * + * @author 张涛(370017892@qq.com) + * @date 2014-7-3 + * + */ +public class UploadPolicy implements Serializable { + + // 目标资源空间 + private String scope; + + public UploadPolicy() { + } + + public UploadPolicy(String scope, String callbackUrl, String callbackBody, + String returnUrl, String returnBody, String endUser, + String saveKey, int insertOnly, int detectMime, long fsizeLimit, + String persistentNotifyUrl, String persistentOps, long deadline) { + super(); + this.scope = scope; + this.callbackUrl = callbackUrl; + this.callbackBody = callbackBody; + this.returnUrl = returnUrl; + this.returnBody = returnBody; + this.endUser = endUser; + this.saveKey = saveKey; + this.insertOnly = insertOnly; + this.detectMime = detectMime; + this.fsizeLimit = fsizeLimit; + this.persistentNotifyUrl = persistentNotifyUrl; + this.persistentOps = persistentOps; + this.deadline = deadline; + } + + /* + * 上传成功后,七牛云向App-Server发送POST请求的URL (必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 + * OK的有效URL) 返回包 Content-Type 为 "application/json",即返回的内容必须是合法的 JSON 文本 + */ + private String callbackUrl; + + /* + * 上传成功后,七牛云向App-Server发送POST请求的数据 支持魔法变量和自定义变量。callbackBody 要求是合法的 url + * query + * string。如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo. + * height)。 + */ + private String callbackBody; + + /* + * Web端文件上传成功后,浏览器执行303跳转的URL 通常用于HTML Form上传。 + * 文件上传成功后会跳转到?upload_ret=, + * 包含returnBody内容。 如不设置returnUrl,则直接将returnBody的内容返回给客户端。 + */ + private String returnUrl; + + /* + * 上传成功后,自定义七牛云最终返回給上传端(在指定returnUrl时是携带在跳转路径参数中)的数据 支持魔法变量和自定义变量。returnBody + * 要求是合法的 JSON 文本。如:{"key": $(key), "hash": $(etag), "w": + * $(imageInfo.width), "h": $(imageInfo.height)}。 + */ + private String returnBody; + + /* + * 唯一属主标识 特殊场景下非常有用,比如根据App-Client标识给图片或视频打水印。 + */ + private String endUser; + + /* + * 自定义资源名 支持魔法变量及自定义变量。这个字段仅当用户上传的时候没有主动指定key的时候起作用。 + */ + private String saveKey; + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getCallbackUrl() { + return callbackUrl; + } + + public void setCallbackUrl(String callbackUrl) { + this.callbackUrl = callbackUrl; + } + + public String getCallbackBody() { + return callbackBody; + } + + public void setCallbackBody(String callbackBody) { + this.callbackBody = callbackBody; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getReturnBody() { + return returnBody; + } + + public void setReturnBody(String returnBody) { + this.returnBody = returnBody; + } + + public String getEndUser() { + return endUser; + } + + public void setEndUser(String endUser) { + this.endUser = endUser; + } + + public String getSaveKey() { + return saveKey; + } + + public void setSaveKey(String saveKey) { + this.saveKey = saveKey; + } + + public int getInsertOnly() { + return insertOnly; + } + + public void setInsertOnly(int insertOnly) { + this.insertOnly = insertOnly; + } + + public int getDetectMime() { + return detectMime; + } + + public void setDetectMime(int detectMime) { + this.detectMime = detectMime; + } + + public long getFsizeLimit() { + return fsizeLimit; + } + + public void setFsizeLimit(long fsizeLimit) { + this.fsizeLimit = fsizeLimit; + } + + public String getPersistentNotifyUrl() { + return persistentNotifyUrl; + } + + public void setPersistentNotifyUrl(String persistentNotifyUrl) { + this.persistentNotifyUrl = persistentNotifyUrl; + } + + public String getPersistentOps() { + return persistentOps; + } + + public void setPersistentOps(String persistentOps) { + this.persistentOps = persistentOps; + } + + public long getDeadline() { + return deadline; + } + + public void setDeadline(long deadline) { + this.deadline = deadline; + } + + /* + * 限定为“新增”语意 如果设置为非0值,则无论scope设置为什么形式,仅能以新增模式上传文件。 + */ + private int insertOnly; + + /* + * 开启MimeType侦测功能 设为非0值,则忽略上传端传递的文件MimeType信息,使用七牛服务器侦测内容后的判断结果 + * 默认设为0值,如上传端指定了MimeType则直接使用该值,否则按如下顺序侦测MimeType值: 1. 检查文件扩展名 2. 检查Key扩展名 + * 3. 侦测内容。 + */ + private int detectMime; + + /* + * 限定上传文件的大小,单位:字节(Byte) 超过限制的上传内容会被判为上传失败,返回413状态码。 + */ + private long fsizeLimit; + + /* + * 接收预转持久化结果通知的URL 必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 OK的有效URL。 + */ + private String persistentNotifyUrl; + + /* + * 资源上传成功后触发执行的预转持久化处理指令列表 每个指令是一个API规格字符串,多个指令用“;”分隔。 + */ + private String persistentOps; + + /* + * 上传请求授权的截止时间 UNIX时间戳,单位:秒。 + */ + private long deadline; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java new file mode 100644 index 0000000..2488a31 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java @@ -0,0 +1,685 @@ +package org.dromara.settlement.dubbo; + +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.mapper.AccountLogMapper; +import org.dromara.settlement.mapper.AccountMapper; +import org.dromara.settlement.mapper.AccountSynMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.dromara.settlement.service.impl.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +@DubboService +public class RemoteAccountServiceImpl implements RemoteAccountService +{ + private static final Logger log = LoggerFactory.getLogger(RemoteAccountServiceImpl.class); + + @Autowired + private ZhaoShangServiceImpl zhaoShangServiceImpl;//招商银行业务 + + @Autowired + private AccountServiceTransactionImpl transactionImpl; + + @Autowired + private JitaoTongServiceImpl jitaoTongServiceImpl;//交通银行业务 + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl;//支付宝业务 + + @Autowired + private MinShengServiceImpl minShengServiceImpl;//民生银行业务 + + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountLogMapper accountLogDao;//银行账户同步明细dao + + @Autowired + private AccountSynMapper accountSynDao;//银行账户同步dao + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Override + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType,Long code) { + return addAccount(unitId, userType, userId, userName, bankType, null, null,code); + } + + @Override + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType, String bindAcctNo, String bindAcctName,Long code) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + Account account = null; + if (bankType.equals("招商银行")) { + account = zhaoShangServiceImpl.createAccount(unitId, code.toString(), userName, userType + ""); + } else if (bankType.equals("交通银行")) { + account = jitaoTongServiceImpl.createAccount(unitId, userId.toString(), userName, userType + ""); + } else if (bankType.equals("支付宝")) { + account = zhiFuBaoServiceImpl.createAccount(unitId, userId.toString(), userName, userType + ""); + } else if (bankType.equals("民生银行")) { + account = minShengServiceImpl.createAccount(unitId, userId.toString(), userName, userType + "", bindAcctNo, bindAcctName); + } + if (account == null) { + result.tip("创建虚拟银行账号:调用银行接口出错"); + return result; + } + account.setAddTime(new Date()); + account.setEditTime(new Date()); + account.setStatus((short) 1); + account.setType((short) 1); + account.setUnitId(unitId); + if (StringUtils.isBlank(account.getName())) { + account.setName(getMainAccountName(unitId, bankType).getAccountName()); + } + Integer row = accountDao.insertSelective(account); + if (row == 0) { + Account acc = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + account.setId(acc.getId()); + } + result.setRtnData(account); + } catch (Exception e) { + String msgStr = "创建虚拟银行账号出错("+userType+","+userId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result addAccount(Account account) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + Account exist = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + if(exist != null) { + //if (exist.getType() == 3 || exist.getType() == 2) {//真实企业账户或真实个人账户 + Account upd = new Account(); + if (StringUtils.isNotBlank(account.getName())) { + upd.setId(exist.getId()); + upd.setName(account.getName()); + exist.setName(account.getName()); + } + if (StringUtils.isNotBlank(account.getBankAddress())) { + upd.setId(exist.getId()); + upd.setBankAddress(account.getBankAddress()); + exist.setBankAddress(account.getBankAddress()); + } + if (StringUtils.isNotBlank(account.getBankArgNo())) { + upd.setId(exist.getId()); + upd.setBankArgNo(account.getBankArgNo()); + exist.setBankArgNo(account.getBankArgNo()); + } + + if (StringUtils.isNotBlank(account.getBankNo())) { + upd.setId(exist.getId()); + upd.setBankNo(account.getBankNo()); + exist.setBankNo(account.getBankNo()); + } + if (upd.getId() != null) { + accountDao.updateByPrimaryKeySelective(upd); + } + //} + exist.setBankTypeName(exist.getBankType()); + result.setRtnData(exist); + return result; + }else { + account.setAddTime(new Date()); + account.setEditTime(new Date()); + account.setStatus((short)1); + account.setBalance(0l); + Integer row = accountDao.insertSelective(account); + if (row == 0) { + account = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + } + account.setBankTypeName(account.getBankType()); + result.setRtnData(account); + } + } catch (Exception e) { + String msgStr = "创建虚拟银行账号出错(" + JSONObject.toJSONString(account) + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + public MainAccount getMainAccountName(long unitId, String bankType) { + // TODO 自动生成的方法存根 + MainAccount main = new MainAccount(); + if (bankType.equals("招商银行")) { + String accnbrname = "zhaoshang_accnbrname"; + String khh = "zhaoshang_khh"; + Map config = wConfigService.getItems(unitId, accnbrname, khh); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + if (config.containsKey(khh) && StringUtils.isNotEmpty(config.get(khh))) { + main.setKhh(config.get(khh)); + } + } else if (bankType.equals("交通银行")) { + String accnbrname = "jiaotong_super_acc_name"; + String khh = "jiaotong_khh"; + Map config = wConfigService.getItems(unitId, accnbrname, khh); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + if (config.containsKey(khh) && StringUtils.isNotEmpty(config.get(khh))) { + main.setKhh(config.get(khh)); + } + } else if (bankType.equals("支付宝")) { + String accnbrname = "zhifubao_acc_name"; + Map config = wConfigService.getItems(unitId, accnbrname); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + } else if (bankType.equals("民生银行")) { + String accnbrname = "minsheng_bank_acctName"; + Map config = wConfigService.getItems(unitId, accnbrname); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + } + return main; + } + + @Override + public Result getMainAccount(long unitId, String bankType) { + Result result = new Result(); + try { + result.setRtnData(getMainAccountName(unitId, bankType)); + } catch (Exception e) { + String msgStr = "获取虚拟银行账号收款账户出错(" + unitId + "," + bankType + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + @Override + public Result getAccountName(long unitId, String bankType, String bankCard) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + result.setRtnData(getMainAccountName(unitId, bankType).getAccountName()); + } catch (Exception e) { + String msgStr = "获取虚拟银行账号收款账户名出错(" + unitId + "," + bankType + "," + bankCard + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + @Override + public Result synAccount(int id, Short trxdir, long synPosition, List exclude) { + // TODO 自动生成的方法存根 + Result result = new Result(); + AccountSyn syn = null; + boolean locked = false; + try { + syn = accountSynDao.selectByPrimaryKey(id); + Account acc = accountDao.selectByPrimaryKey(id); + if (syn == null) { + syn = new AccountSyn(); + syn.setId(acc.getId()); + syn.setUnitId(acc.getUnitId()); + syn.setType(acc.getType()); + syn.setBankCard(acc.getBankCard()); + syn.setBankType(acc.getBankType()); + syn.setType(acc.getType()); + syn.setSynLock((byte)0); + accountSynDao.insertSelective(syn); + } + if (accountSynDao.lock(acc.getId()) == 0) { + result.tip("正在同步"); + syn = null; + return result; + } + locked = true; + syn.setBalance(acc.getBalance()); + syn.setAddAmount(0l); + syn.setReductionAmount(0l); + syn.setTrxnbrs(""); + boolean isSyn = false; + if (syn.getBankType().equals("招商银行")) { + syn = zhaoShangServiceImpl.synAccount(syn); + isSyn = true; + }else if (syn.getBankType().equals("交通银行")) { + syn = jitaoTongServiceImpl.synAccount(syn); + isSyn = true; + } else if (syn.getBankType().equals("民生银行")) { + syn = minShengServiceImpl.synAccount(syn); + isSyn = true; + } + if (isSyn) { + transactionImpl.saveAccountLog(syn); + } + syn.setLogs(accountLogDao.selectByAccId(id, synPosition, trxdir)); + Iterator iter = syn.getLogs().iterator(); + while (iter.hasNext()) { + AccountLog log = (AccountLog) iter.next(); + if(exclude != null && exclude.contains(log.getTrxtxt())) { + iter.remove(); + }else { + if (log.getTrxdir().intValue() == 1) {//收入 + syn.setAddAmount(syn.getAddAmount()+log.getTrxamt()); + }else if (log.getTrxdir().intValue() == 2) {//支出,Trxamt是复数 + syn.setReductionAmount(syn.getReductionAmount()-log.getTrxamt()); + } + } + } + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "同步银行账户出错("+id+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + }finally { + if(locked) { + try { + AccountSyn unlock = new AccountSyn(); + unlock.setId(syn.getId()); + unlock.setSynLock((byte)0); + unlock.setSynPosition(syn.getSynPosition()); + unlock.setSynTime(syn.getSynTime()); + accountSynDao.updateByPrimaryKeySelective(unlock); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("同步银行账户时解锁出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + } + return result; + } + + @Override + public Result applyTransfer(int sourceAccId, int targetAccId, Long amount, String order, String remark) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + /*boolean sourceAccLocked = false; + boolean targetAccLocked = false;*/ + try { + Account source = accountDao.selectByPrimaryKey(sourceAccId); + if(source == null) { + result.tip("付款账户("+sourceAccId+")不存在"); + return result; + } + Account target = accountDao.selectByPrimaryKey(targetAccId); + if(target == null) { + result.tip("收款账户("+targetAccId+")不存在"); + return result; + } + /*if (source.getBalance() < amount) { + result.tip("付款账户("+sourceAccId+")余额不足"); + return result; + }*/ + syn = new TransactionLog(); + syn.setUnitId(source.getUnitId()); + syn.setOrderNo(order); + syn.setAddTime(new Date()); + syn.setAmount(amount); + syn.setRemark(remark); + syn.setResult((short)-1); + syn.setSourceAccId(sourceAccId); + syn.setSourceCard(source.getBankCard()); + syn.setTargetAccId(targetAccId); + syn.setTargetCard(target.getBankCard()); + syn.setTargetAccName(target.getName()); + syn.setBankType(source.getBankType()); + transactionLogDao.insertSelective(syn); + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "申请银行账户转账出错("+sourceAccId+","+targetAccId+","+amount+","+order+","+remark+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result transfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + /*boolean sourceAccLocked = false; + boolean targetAccLocked = false;*/ + Account target = null; + try { + syn = transactionLogDao.selectByPrimaryKey(tranId); + if (syn == null) { + result.tip("交易记录不存在"); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + if(source == null) { + result.tip("付款账户("+syn.getSourceAccId()+")不存在"); + return result; + } + syn.setBankType(source.getBankType()); + if (transactionLogDao.lock(tranId) == 0) { + result.tip("交易记录已处理"); + result.setRtnData(syn); + return result; + } + target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if(target == null) { + result.tip("收款账户("+syn.getTargetAccId()+")不存在"); + return result; + } + /*if (source.getBalance() < syn.getAmount()) { + result.tip("付款账户("+syn.getSourceAccId()+")余额不足"); + return result; + }*/ + /*if (accountDao.lock(sourceAccId) == 0) { + result.tip("付款账户("+sourceAccId+")交易中"); + return result; + } + sourceAccLocked = true; + if (accountDao.lock(targetAccId) == 0) { + result.tip("收款账户("+targetAccId+")交易中"); + return result; + } + targetAccLocked = true;*/ + if(syn.getAmount() > 0) { + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 1) {//虚拟账户 + syn = zhaoShangServiceImpl.innerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = zhaoShangServiceImpl.crossPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn.setBankType(target.getBankType()); + syn.setTargetAccName(target.getName()); + syn.setTargetAccBankAddr(target.getBankAddress()); + syn = zhaoShangServiceImpl.crossEnterpriseTransfer(syn); + } + }else if (source.getBankType().equals("交通银行")) { + syn.setBankType(target.getBankType()); + syn.setSourceAccName(source.getName()); + if (target.getType() == 1) {//虚拟账户 + syn = jitaoTongServiceImpl.innerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = jitaoTongServiceImpl.crossPersionTransfer(syn,source.getBankArgNo()); + }else if (target.getType() == 3) {//真实企业账户 + syn = jitaoTongServiceImpl.transfer(syn); + } + }else if (source.getBankType().equals("支付宝")) { + syn.setSourceCard(source.getBankArgNo()); + if (target.getType() == 1) {//虚拟账户 + syn.setTargetCard(target.getBankArgNo()); + syn = zhiFuBaoServiceImpl.innerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = zhiFuBaoServiceImpl.transfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = zhiFuBaoServiceImpl.transfer(syn); + } + } else if (source.getBankType().equals("民生银行")) { + syn.setBankType(target.getBankType()); + syn.setSourceAccName(source.getName()); + if (target.getType() == 1) {//虚拟账户 + syn = minShengServiceImpl.innerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = minShengServiceImpl.crossPersionTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = minShengServiceImpl.transfer(syn, target.getBankNo()); + } + } + }else { + syn.setResult((short)2); + } + syn.setBankType(source.getBankType()); + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "银行账户转账出错("+tranId+"):"; + log.error(msgStr,e); + if (target == null || target.getType() != 1) {//非虚拟账户,则出现异常就失败 + syn.setResult((short)3);//失败 + syn.setReason(e.getMessage()); + } + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + }finally { + try { + /*Account unlock = new Account(); + unlock.setStatus((short)1); + if(sourceAccLocked) { + unlock.setId(sourceAccId); + accountDao.updateByPrimaryKeySelective(unlock); + } + if(targetAccLocked) { + unlock.setId(targetAccId); + accountDao.updateByPrimaryKeySelective(unlock); + }*/ + if(syn != null) { + if (syn.getResult() == -1) { + transactionLogDao.unlock(syn.getId()); + }else { + TransactionLog upd = new TransactionLog(); + upd.setId(syn.getId()); + upd.setSourceBankNo(syn.getSourceBankNo()); + upd.setTargetBankNo(syn.getTargetBankNo()); + upd.setTranTime(new Date()); + upd.setResult(syn.getResult()); + upd.setReason(syn.getReason()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("保存银行账户交易结果出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + return result; + } + + @Override + public Result synTransfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + try { + syn = transactionLogDao.selectByPrimaryKey(tranId); + if (syn == null) { + result.tip("交易记录不存在"); + return result; + } + if (syn.getResult().intValue() > 1) { + result.setRtnData(syn); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + syn.setBankType(source.getBankType()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + syn = zhaoShangServiceImpl.synPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn = zhaoShangServiceImpl.synEnterpriseTransfer(syn); + } + }else if (source.getBankType().equals("交通银行")) { + if (target.getType() == 1) {//云账户 + syn = jitaoTongServiceImpl.synInnerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = jitaoTongServiceImpl.synPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn = jitaoTongServiceImpl.synTransfer(syn); + } + }else if (source.getBankType().equals("支付宝")) { + if (target.getType() == 1) {//记账本 + syn = zhiFuBaoServiceImpl.synInnerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = zhiFuBaoServiceImpl.synTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = zhiFuBaoServiceImpl.synTransfer(syn); + } + } else if (source.getBankType().equals("民生银行")) { + if (target.getType() == 1) {//云账户 + syn = minShengServiceImpl.synInnerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = minShengServiceImpl.synTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = minShengServiceImpl.synTransfer(syn); + } + } + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "同步银行账户交易结果出错("+tranId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + }finally { + try { + if(syn != null) { + TransactionLog upd = new TransactionLog(); + upd.setId(syn.getId()); + upd.setSourceBankNo(syn.getSourceBankNo()); + upd.setTargetBankNo(syn.getTargetBankNo()); + upd.setTranTime(syn.getTranTime()); + upd.setResult(syn.getResult()); + upd.setReason(syn.getReason()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("保存银行账户交易结果出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + return result; + } + + @Override + public Result getTransfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + result.setRtnData(transactionLogDao.selectByPrimaryKey(tranId)); + if (result.getRtnData() != null) { + Account source = accountDao.selectByPrimaryKey(result.getRtnData().getSourceAccId()); + if(source != null) + result.getRtnData().setBankType(source.getBankType()); + } + } catch (Exception e) { + String msgStr = "查询交易记录出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getTransferCallBack(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + TransactionLog syn = transactionLogDao.selectByPrimaryKey(tranId); + if (StringUtils.isNotBlank(syn.getPayReceipt())) { + result.setRtnData(syn.getPayReceipt()); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + result.setRtnData(zhaoShangServiceImpl.getTransferCallback(syn)); + }else if (target.getType() == 3) {//真实企业账户 + result.setRtnData(zhaoShangServiceImpl.getTransferCallback(syn)); + } + }else if (source.getBankType().equals("交通银行")) { + result.setRtnData(jitaoTongServiceImpl.getTransferCallback(syn)); + }else if (source.getBankType().equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getTransferCallback(syn)); + } else if (source.getBankType().equals("民生银行")) { + result.setRtnData(minShengServiceImpl.getTransferCallback(syn)); + } + } catch (Exception e) { + String msgStr = "获取交易回置单出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getTransferBankNo(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + TransactionLog syn = transactionLogDao.selectByPrimaryKey(tranId); + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); + }else if (target.getType() == 3) {//真实企业账户 + result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); + } +// else if(target.getType() == 1){//虚拟户 +// result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); +// } + }else if (source.getBankType().equals("交通银行")) { + result.setRtnData(jitaoTongServiceImpl.getTransferBankNo(syn)); + }else if (source.getBankType().equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getTransferBankNo(syn)); + } else if (source.getBankType().equals("民生银行")) { + result.setRtnData(minShengServiceImpl.getTransferBankNo(syn)); + } + if (StringUtils.isNotBlank(result.getRtnData())) { + TransactionLog upd = new TransactionLog(); + upd.setId(tranId); + upd.setTargetBankNo(result.getRtnData()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } catch (Exception e) { + String msgStr = "获取交易流水号出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getSignInfo(long unitId, String unitName, String bankType) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + if (bankType.equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getAgreementQrcode(unitId, unitName)); + } + } catch (Exception e) { + String msgStr = "获取签约信息出错("+unitId+","+unitName+","+bankType+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java new file mode 100644 index 0000000..3b59988 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java @@ -0,0 +1,182 @@ +package org.dromara.settlement.dubbo; + +import java.net.URLEncoder; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.RemoteAuthService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.auth.BankCardInfo; +import org.dromara.settlement.api.domain.auth.BankInfo; +import org.dromara.settlement.api.domain.auth.CardIdBack; +import org.dromara.settlement.api.domain.auth.CardIdPositive; +import org.dromara.settlement.common.PostDataTools; +import org.dromara.settlement.service.impl.ZhiFuBaoServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestMethod; + + +@Service +@DubboService +public class RemoteAuthServiceImpl implements RemoteAuthService +{ + private static final Logger log = LoggerFactory.getLogger(RemoteAuthServiceImpl.class); + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl;//支付宝业务 + + @Override + public Result authCardIdPositive(String positive) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://ocridcard.market.alicloudapi.com/idimages", "image="+positive+"&idCardSide=front", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证身份证正面出错,请检查参数"); + } + + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").equals("1")) { + CardIdPositive worker = JSONObject.parseObject(JSONObject.toJSONString(param.get("result")), CardIdPositive.class); + worker.setBirthday(worker.getBirthday().substring(0,4)+"-"+worker.getBirthday().substring(4,6)+"-"+worker.getBirthday().substring(6,8)); + result.setRtnData(worker); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证身份证正面出错("+positive+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authCardIdBack(String back) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://ocridcard.market.alicloudapi.com/idimages", "image="+back+"&idCardSide=back", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证身份证反面出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").equals("1")) { + CardIdBack worker = JSONObject.parseObject(JSONObject.toJSONString(param.get("result")), CardIdBack.class); + worker.setIssueDate(worker.getIssueDate().substring(0,4)+"-"+worker.getIssueDate().substring(4,6)+"-"+worker.getIssueDate().substring(6,8)); + if(worker.getExpiryDate().length() == 8) { + worker.setExpiryDate(worker.getExpiryDate().substring(0,4)+"-"+worker.getExpiryDate().substring(4,6)+"-"+worker.getExpiryDate().substring(6,8)); + } + result.setRtnData(worker); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证身份证反面出错("+back+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authBankMatch(String bankcard, String name, String idcard) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageNullParam("https://bankcard234.shumaidata.com/bankcard234?bankcard="+bankcard+"&idcard="+idcard+"&name="+URLEncoder.encode(name,"UTF-8"), RequestMethod.GET, + new String[] { "Content-Type:application/json; charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" },false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证银行卡出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").toString().equals("200") && param.containsKey("data")) { + Map data = (Map)param.get("data"); + if (data.get("result").toString().equals("0") && data.containsKey("bank_info")) { + result.setRtnData(JSONObject.parseObject(JSONObject.toJSONString(data.get("bank_info")), BankInfo.class)); + } + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证银行卡是否一致出错("+bankcard+","+name+","+idcard+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authBankInfo(String bankcardUrl) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://cardid.market.alicloudapi.com/ai_market/ai_ocr_universal/yin_hang_ka/v1", "IMAGE="+bankcardUrl+"&IMAGE_TYPE=1", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证银行卡出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.containsKey("银行卡实体信息")) { + Map map = (Map)param.get("银行卡实体信息"); + BankCardInfo bank = new BankCardInfo(); + bank.setCard(map.get("银行卡号")+""); + bank.setExpireDate(map.get("银行卡有效期")+""); + bank.setName(map.get("银行名称")+""); + bank.setType(map.get("银行卡类型")+""); + bank.setTypeName(map.get("银行卡类型名称")+""); + result.setRtnData(bank); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证银行卡信息出错("+bankcardUrl+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result valiAccount(long unitId, String bankType, String bankCard, String mobile, String name, + String cardId) { + // TODO 自动生成的方法存根 + Result result = new Result(false); + try { + if (bankType.equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.valiAccount(bankCard, mobile, name, cardId)); + } + } catch (Exception e) { + String msgStr = "验证银行账号是否有效出错("+unitId+","+bankType+","+bankCard+","+mobile+","+name+","+cardId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java new file mode 100644 index 0000000..c7ccfa5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java @@ -0,0 +1,441 @@ +package org.dromara.settlement.dubbo; + + +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.constant.SystemConfig; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.PropertyUtils; +import org.dromara.settlement.common.QiniuUtils; +import org.dromara.settlement.domain.SelectData; +import org.dromara.settlement.domain.SysUnitConfig; +import org.dromara.settlement.mapper.SysUnitConfigMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Service +@DubboService +public class RemoteConfigServiceImpl implements RemoteConfigService { + private static final Logger log = LoggerFactory.getLogger(RemoteConfigServiceImpl.class); + /** + * 空值 + */ + public final String EMPTY = "-empty-"; + + @Autowired + private SysUnitConfigMapper unitConfigDao;//单位配置 + + @Override + public Boolean valiServiceAccess(long unitId, String key) { + // TODO 自动生成的方法存根 + try { + Map items = getItemsMap(unitId, key); + if(items.containsKey(key) && StringUtils.isNotBlank(items.get(key))) + return true; + } catch (Exception e) { + // TODO 自动生成的 catch 块 + String msg = "验证服务是否能访问出错:("+ unitId + "," + key +")"; + log.error(msg,e); + } + return false; + } + + @Override + public String getItem(long unitId, String key) { + // TODO 自动生成的方法存根 + try { + Map items = getItemsMap(unitId, key); + return items.get(key); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + String msg = "获取配置项出错:("+ unitId + "," + key +")"; + log.error(msg,e); + } + return null; + } + + @Override + public Map getItems(long unitId, String... keys) { + // TODO 自动生成的方法存根 + try { + return getItemsMap(unitId, keys); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + String msg = "获取配置项出错:("+ unitId + "," + keys +")"; + log.error(msg,e); + } + return null; + } + + private String getUnitConfigKey(long unitId){ + return "config:"+unitId; + } + + private String getItemValue(String redisKey,String key,Object itemObj){ + String itemValue = null; + if (itemObj == null) { + itemValue = EMPTY; + RedisUtils.setCacheMapValue(redisKey, key, itemValue); + }else { + itemValue = itemObj.toString(); + } + if(itemValue.equals(EMPTY)){ + itemValue = null; + } + return itemValue; + } + + private Map getItemsMap(long unitId, String... keys) throws InterruptedException { + // TODO 自动生成的方法存根 + Map configMap = new HashMap(); + if(keys.length > 0){ + String redisKey = getUnitConfigKey(unitId); + boolean read = false;//需要读取数据库 + if(keys.length == 1){ + if(RedisUtils.hasKey(redisKey)){ + Object itemObj = RedisUtils.getCacheMapValue(redisKey, keys[0]); + String itemValue = getItemValue(redisKey, keys[0], itemObj); + configMap.put(keys[0], itemValue); + return configMap; + }else{ + read = true; + } + }else { + Map map = RedisUtils.getCacheMap(redisKey); + if (map != null && map.size() > 0) { + for (String key : keys) { + Object itemObj = map.get(key); + String itemValue = getItemValue(redisKey, key, itemObj); + configMap.put(key, itemValue); + } + } else { + read = true; + } + } + if (read) { + int lockTime = 10 * 1000;//毫秒 + RLock lock = RedisUtils.getClient().getLock(redisKey); + boolean lockResult = lock.tryLock(lockTime,TimeUnit.MILLISECONDS); + if(lockResult){ + try { + Map unitConfig = new HashMap(); + int common = 0;//公共配置 + List configList = unitConfigDao.selectByUnit(unitId+","+common, null); + //默认的配置 + for (SysUnitConfig con : configList) { + if(con.getConfUnit() == common){ + unitConfig.put(con.getConfItem(), con.getConfValue() == null ?"":con.getConfValue()); + if(con.getIsEnable() != null && con.getIsEnable() == 1 && StringUtils.isNotEmpty(con.getClassAlias()))//key:配置分类别名 value:配置组 + unitConfig.put(con.getClassAlias(), con.getConfGroup()); + } + } + //单位配置 + for (SysUnitConfig con : configList) { + if(con.getConfUnit() == unitId){ + unitConfig.put(con.getConfItem(), con.getConfValue() == null ?"":con.getConfValue()); + if(con.getIsEnable() != null && con.getIsEnable() == 1 && StringUtils.isNotEmpty(con.getClassAlias()))//key:配置分类别名 value:配置组 + unitConfig.put(con.getClassAlias(), con.getConfGroup()); + } + } + //防止穿透 + for (String key : keys) { + configMap.put(key, unitConfig.containsKey(key) ? unitConfig.get(key)+"" : null); + if (!unitConfig.containsKey(key)) { + unitConfig.put(key, EMPTY); + } + } + + RedisUtils.setCacheMap(redisKey, unitConfig); + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("读取数据库配置出错:("+unitId+")",e); + }finally{ + if(lock.isLocked() && lock.isHeldByCurrentThread()){ + lock.unlock(); + } + } + }else { + // 设置失败次数计数器, 当到达5次时, 返回失败 + int failCount = 1; + int sleepTime = 100;//毫秒 + int maxFailCount = lockTime / sleepTime; + while(failCount <= maxFailCount){ + // 等待100ms重试 + try { + TimeUnit.MILLISECONDS.sleep(sleepTime); + } catch (InterruptedException e) { + log.error("等待缓存读取出错:("+unitId+","+keys+")",e); + } + configMap = getItemsMap(unitId, keys); + if (configMap.size() > 0){ + // 执行逻辑操作 + break; + }else{ + failCount ++; + } + } + } + } + } + return configMap; + } + + @Override + public String getUploadNetPath(long unitId) { + // TODO 自动生成的方法存根 + String key = "download_root_path"; + //String path = propertyUtils.getPropertiesString(key); + String path = ""; + if (StringUtils.isBlank(path)) { + path = getItem(unitId, key); + } + if (StringUtils.isBlank(path)) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):缺少配置"); + return ""; + } + if (!path.substring(path.length()-1).equals("/")) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):应以/结尾"); + return ""; + } + path = path + unitId + "/"; + return path; + } + + @Override + public SystemConfig.StoreType getStoreType(long unitId) { + // TODO 自动生成的方法存根 + String storeType = getItem(unitId, "store.type"); + return SystemConfig.StoreType.valueOfs(storeType); + } + + @Override + public String getUploadPhyPath(long unitId) { + // TODO 自动生成的方法存根 + String key = "upload_root_pathpage"; + //String path = propertyUtils.getPropertiesString(key); + String path = ""; + if (StringUtils.isBlank(path)) { + path = getItem(unitId, key); + } + if (StringUtils.isBlank(path)) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):缺少配置"); + return ""; + } + if (!path.substring(path.length()-1).equals("/")) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):应以/结尾"); + return ""; + } + path = path + unitId; + return path; + } + + @Override + public String getQiNiuDomain(long unitId) { + // TODO 自动生成的方法存根 + return getItem(unitId, "QiNiu_DOMAIN"); + } + + @Override + public String getQiNiuUptoken(long unitId) { + // TODO 自动生成的方法存根 + try { + String bucketKey = "QiNiu_BUCKET"; + String accesskeyKey = "QiNiu_AccessKey"; + String secretkeyKey = "QiNiu_SecretKey"; + Map configs = getItemsMap(unitId, bucketKey,accesskeyKey,secretkeyKey); + return QiniuUtils.getUptoken(configs.get(accesskeyKey), configs.get(secretkeyKey), configs.get(bucketKey), null, null); + } catch (Exception e) { + String msg = "获取七牛上传凭证出错:("+ unitId +")"; + log.error(msg,e); + } + return ""; + } + + @Override + public Result> getConfClass(Long unit_id, String unitType) { + Result> result = new Result>(); + try { + List confClass = unitConfigDao.getConfClass(unit_id,unitType); + result.setRtnData(confClass); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result> getConfGroupByUnit(Long unit_id, String class_alias) { + Result> result = new Result>(); + try { + //查询默认的大类下的组分类 + List defGroups = unitConfigDao.getConfGroupByUnit(0L,class_alias); + if(!CollectionUtils.isEmpty(defGroups)) { + List schoolGroups = unitConfigDao.getConfGroupByUnit(unit_id,class_alias); + if(!CollectionUtils.isEmpty(schoolGroups)) {//如果学校下面这个大类配置了,把默认选中的置为不选中 + for(UnitConfGroup def : defGroups) { + def.setIs_enable(0); + for(UnitConfGroup school:schoolGroups) { + if(def.getConf_group().equals(school.getConf_group())) { + def.setIs_enable(school.getIs_enable()); + } + } + } + }else{ + int i = 0; + for(UnitConfGroup def : defGroups) { + if(i == 0){ + def.setIs_enable(1); + }else{ + def.setIs_enable(0); + } + i++; + } + } + } + result.setRtnData(defGroups); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result> getConfDetailByUnit(Long unit_id, String conf_group) { + Result> result = new Result>(); + try { + List unitDetails = unitConfigDao.getConfDetailByUnit(unit_id,conf_group); + List exists = new ArrayList(); + for (UnitConfDetail d : unitDetails) { + exists.add(d.getConf_item()); + } + List defaultDetails =unitConfigDao.getConfDetailByUnit(0L,conf_group); + for(UnitConfDetail de :defaultDetails) { + de.setConf_value(""); + if (!exists.contains(de.getConf_item())) { + unitDetails.add(de); + } + } + result.setRtnData(unitDetails); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + @Transactional + public Result editConfDetail(List lendReco) { + Result result = new Result(); + try { + //缓存配置 + Map unitConfig = new HashMap(); + for(UnitConfDetail detail : lendReco) { + detail.setIs_enable(1); + detail.setConf_is_editor(1); + detail.setConf_unit_type(1); + if(detail.getConf_unit()==null||detail.getConf_unit().intValue()==0) { + result.addError("企业配置信息内容项不完整"); + return result; + } + unitConfig.put(detail.getConf_item(), detail.getConf_value()); + if(detail.getIs_enable() != null && detail.getIs_enable() == 1 && StringUtils.isNotEmpty(detail.getClass_alias()))//key:配置分类别名 value:配置组 + unitConfig.put(detail.getClass_alias(), detail.getConf_group()); + } + //该企业下这个大类置为不可用 + unitConfigDao.updateIsEnableByUnit(lendReco.get(0).getConf_unit(),lendReco.get(0).getClass_alias()); + //删除企业下这个组的配置信息 + unitConfigDao.delConfIsEnableByUnit(lendReco.get(0).getConf_unit(),lendReco.get(0).getConf_group()); + //保存企业配置 + unitConfigDao.addConf(lendReco); + //如果缓存已加载,则更新缓存 + String redisKey = getUnitConfigKey(lendReco.get(0).getConf_unit()); + if (RedisUtils.hasKey(redisKey) && unitConfig.size() > 0) { + RedisUtils.setCacheMap(redisKey, unitConfig);//6天 + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } + result.setRtnData(true); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result getQiniuConfg(Long unit_id) { + Result result = new Result(); + try { + String bucketKey = "QiNiu_BUCKET"; + String accesskeyKey = "QiNiu_AccessKey"; + String secretkeyKey = "QiNiu_SecretKey"; + String secretregion = "QiNiu_Region"; + String secretdomain = "QiNiu_DOMAIN"; + Map configs = getItemsMap(unit_id, bucketKey,accesskeyKey,secretkeyKey,secretregion,secretdomain); + String token = QiniuUtils.getUptoken(configs.get(accesskeyKey), configs.get(secretkeyKey), configs.get(bucketKey), null, null); + QiNiuConfig con = new QiNiuConfig(); + con.setQiNiu_BUCKET(configs.get(bucketKey)); + con.setQiNiu_AccessKey(configs.get(accesskeyKey)); + con.setQiNiu_SecretKey(configs.get(secretkeyKey)); + con.setQiNiu_Region(configs.get(secretregion)); + con.setQiNiu_DOMAIN(configs.get(secretdomain)); + con.setToken(token); + result.setRtnData(con); + } catch (Exception e) { + String msg = "获取七牛上传配置出错:("+ unit_id +")"; + log.error(msg,e); + result.setRtnCode(ResultCodeEnum.ERROR); + } + return result; + } + + @Override + @Transactional + public Result saveConfigById(Long unitId, String key,String value) { + Result result = new Result(); + try { + //删除原来老的配置 + unitConfigDao.delConfig(unitId,key); + unitConfigDao.saveConfig(unitId,key,value); + String redisKey = getUnitConfigKey(unitId); + Map unitConfig = new HashMap(); + unitConfig.put(key, value); + if (RedisUtils.hasKey(redisKey) && unitConfig.size() > 0) { + RedisUtils.setCacheMap(redisKey, unitConfig); + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } + result.setRtnData(true); + }catch (Exception e) { + String msg = "配置信息失败"; + log.error(msg,e); + result.setRtnCode(ResultCodeEnum.ERROR); + } + return result; + } + + + + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java new file mode 100644 index 0000000..9cded05 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java @@ -0,0 +1,53 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountLog; + +import java.util.List; + +public interface AccountLogMapper extends BaseMapperPlus { + /** + * 查询已同步的交易流水号 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 账户id + * @param trxnbrs 验证的流水号(多个逗号分隔) + * @param beginTime 交易开始时间 + * @param endTime 交易结束时间 + * @return + */ + public List selectTrxnbrByAccId(@Param("accId") int accId,@Param("trxnbrs") String trxnbrs,@Param("beginTime") String beginTime,@Param("endTime") String endTime); + + /** + * 查询已同步的内部交易流水号 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 账户id + * @param trxnbrs 验证的流水号(多个逗号分隔) + * @param beginTime 交易开始时间 + * @param endTime 交易结束时间 + * @return + */ + public List selectNarinnByAccId(@Param("accId") int accId,@Param("trxnbrs") String trxnbrs,@Param("beginTime") String beginTime,@Param("endTime") String endTime); + + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); + + /** + * 查询账户大于指定id的交易记录 + * @author 张涛 + * @date 2021年9月10日 + * @param accId 账户id + * @param minId 最小流水id + * @param trxdir 流水方向(1:收入 2:支出) + * @return + */ + public List selectByAccId(@Param("accId") int accId,@Param("minId") long minId,@Param("trxdir") Short trxdir); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java new file mode 100644 index 0000000..6abaa16 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java @@ -0,0 +1,44 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountSyn; + +public interface AccountMapper extends BaseMapperPlus { + int insertSelective(Account record); + + int updateByPrimaryKeySelective(Account record); + + public Account selectByPrimaryKey(Integer id); + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 查询银行账户 + * @author 张涛 + * @date 2021年9月15日 + * @param bankCard 账户卡号 + * @param bankType 银行类型 + * @return + */ + public Account selectByCardAndType(@Param("bankCard") String bankCard,@Param("bankType") String bankType); + + /** + * 根据协议编号查询银行账户 + * @author 张涛 + * @date 2022年8月30日 + * @param unitId + * @param bankType + * @param bankArgNo + * @return + */ + public Account selectByArgNoAndType(@Param("unitId") long unitId,@Param("bankType") String bankType,@Param("bankArgNo") String bankArgNo); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java new file mode 100644 index 0000000..8d74c2a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.checkerframework.checker.units.qual.K; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountSyn; + + +public interface AccountSynMapper extends BaseMapperPlus { + /** + * 锁定同步的账户 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer lock(@Param("id") int id); + + + public AccountSyn selectByPrimaryKey(Integer id); + + int insertSelective(AccountSyn record); + + int updateByPrimaryKeySelective(AccountSyn record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java new file mode 100644 index 0000000..845e4a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java @@ -0,0 +1,37 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.settlement.api.domain.TransactionLog; + + +public interface SignZhifubaoMapper extends BaseMapperPlus { + /** + * 查询支付宝签约信息 + * @author 张涛 + * @date 2022年8月30日 + * @param appId 应用id + * @return + */ + public SignZhifubao selectByAppId(@Param("appId") String appId); + + /** + * 根据appid和单位id更新签约信息 + * @author 张涛 + * @date 2022年9月13日 + * @param info + * @return + */ + public Integer updateByAppId(SignZhifubao info); + + /** + * 查询一个有效的支付宝签约信息 + * @author 张涛 + * @date 2022年12月8日 + * @return + */ + public SignZhifubao selectValid(); + + int insertSelective(SignZhifubao record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java new file mode 100644 index 0000000..07b1384 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.checkerframework.checker.units.qual.K; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.domain.SysLog; + +import java.util.List; + +public interface SysLogMapper extends BaseMapperPlus { + /** + * 根据交易id删除日志 + * @author 张涛 + * @date 2021年9月17日 + * @param tranId 交易id + * @param id 删除时排除的日志id + * @return + */ + public Integer deleteByTranId(@Param("tranId") long tranId,@Param("id") Long id); + + + int deleteByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysLog record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java new file mode 100644 index 0000000..a73ded7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java @@ -0,0 +1,133 @@ +package org.dromara.settlement.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.UnitConfClass; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.dromara.settlement.domain.SysUnitConfig; +import org.dromara.settlement.domain.SysUnitConfigKey; + +import java.util.List; + +public interface SysUnitConfigMapper extends BaseMapperPlus { + /** + * 查询单位的配置项 + * @author 张涛 + * @date 2021年1月13日 + * @param unitIds 单位id(多个逗号分隔) + * @param items 配置项唯一标识(多个逗号分隔) + * @return + */ + public List selectByUnit(@Param("conf_units") String unitIds,@Param("conf_items") String items); + + + + /** + * Description: {功能简述} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfClass(@Param("unit_id") Long unit_id, @Param("unit_type") String unit_type); + + /** + * Description: {查询大类下的组信息} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfGroupByUnit(@Param("unit_id") Long unit_id, @Param("class_alias") String class_alias); + + /** + * Description: {功能简述} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfDetailByUnit(@Param("unit_id") Long unit_id, @Param("conf_group") String conf_group); + + /** + * Description: {更新企业下大类的所有配置都是不可用} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void updateIsEnableByUnit(@Param("unit_id") Long conf_unit,@Param("class_alias") String class_alias); + + /** + * Description: {删除配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void delConfIsEnableByUnit(@Param("unit_id") Long conf_unit,@Param("conf_group") String conf_group); + + /** + * Description: {保存配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void addConf(List lendReco); + + + + + + /** + * Description: {删除配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.config.dao.unit + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public void delConfig(@Param("unit_id") Long conf_unit,@Param("key") String key); + + + + /** + * Description: {保存单个配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.config.dao.unit + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public void saveConfig(@Param("unit_id") Long conf_unit,@Param("key") String key,@Param("value") String value); + + + + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java new file mode 100644 index 0000000..77c8af8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java @@ -0,0 +1,55 @@ +package org.dromara.settlement.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.TransactionLog; +import org.dromara.settlement.domain.SysLog; + +public interface TransactionLogMapper extends BaseMapperPlus { + /** + * 锁定交易记录 + * @author 张涛 + * @date 2021年9月6日 + * @param id 交易记录id + * @return + */ + public Integer lock(@Param("id") long id); + + /** + * 解锁交易记录 + * @author 张涛 + * @date 2021年9月6日 + * @param id 交易记录id + * @return + */ + public Integer unlock(@Param("id") long id); + + /** + * 记录交易的回执单地址 + * + * @param bankType 银行类型 + * @param trans 回执单列表 + * @return + * @author 张涛 + * @date 2022年8月3日 + */ + public Integer updatePayReceipt(@Param("bankType") String bankType, @Param("trans") List trans); + + /** + * 查询交易记录 + * + * @param sourceCard 付款方卡号 + * @param sourceBankNo 付款交易号(银行流水号) + * @return + */ + public TransactionLog selectBySourceBankNo(@Param("sourceCard") String sourceCard, @Param("sourceBankNo") String sourceBankNo); + + int updateByPrimaryKeySelective(TransactionLog record); + + int insertSelective(TransactionLog record); + + public TransactionLog selectByPrimaryKey(Long id); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java new file mode 100644 index 0000000..39ee3e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.service; + +import java.util.Map; + +/** + * 公开业务 + */ +public interface IPublicService { + /** + * 支付宝充值通知 + * @author 张涛 + * @date 2022年8月25日 + * @param msg + * @return + */ + public String zfbNotify(Map paramss); + + /** + * 支付宝签约通知 + * @author 张涛 + * @date 2022年8月29日 + * @param request + * @return + */ + public String signNotify(Map paramss); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java new file mode 100644 index 0000000..74772c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java @@ -0,0 +1,117 @@ +package org.dromara.settlement.service.impl; + +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.common.BussinessVariable; +import org.dromara.settlement.mapper.AccountLogMapper; +import org.dromara.settlement.mapper.AccountMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + + +@Service +public class AccountServiceTransactionImpl +{ + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountLogMapper accountLogDao;//银行账户同步明细dao + + @Transactional + public void saveAccountLog(AccountSyn syn) { + // TODO 自动生成的方法存根 + if (syn.getLogs() != null && syn.getLogs().size() > 0) { + Collections.sort(syn.getLogs(),new Comparator() { + @Override + public int compare(AccountLog o1, AccountLog o2) { + // 返回值为int类型,大于0表示正序,小于0表示逆序 + if(o2.getTranTime().getTime() > o1.getTranTime().getTime()) { + return -1; + }else if (o2.getTranTime().getTime() < o1.getTranTime().getTime()) { + return 1; + }else { + return 0; + } + } + }); + String beginTime = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD_HH_MM_SS, syn.getLogs().get(0).getTranTime()); + String endTime = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD_HH_MM_SS, syn.getLogs().get(syn.getLogs().size()-1).getTranTime()); + List exists = accountLogDao.selectTrxnbrByAccId(syn.getId(), syn.getTrxnbrs(), beginTime, endTime); + Iterator iter = syn.getLogs().iterator(); + //key:银行交易流水号,value:交易记录 + Map refundTrxnbrs = new HashMap(); + String refundBeginTime = null;//退票记录所属开始时间 + String refundEndTime = null;//退票记录所属结束时间 + boolean balanceChange = false;//账户余额是否变动 + while (iter.hasNext()) { + AccountLog log = (AccountLog) iter.next(); + if (exists.contains(log.getTrxnbr())) { + iter.remove(); + }else { + if (log.getTrxdir().intValue() == 1) {//收入 + syn.setBalance(syn.getBalance()+log.getTrxamt()); + }else if (log.getTrxdir().intValue() == 2) {//支出,Trxamt是复数 + syn.setBalance(syn.getBalance()+log.getTrxamt()); + } + log.setBalance(syn.getBalance()); + balanceChange = true; + if (StringUtils.isNotBlank(log.getRefundTrxnbr())) { + refundTrxnbrs.put(log.getRefundTrxnbr(),log); + if (StringUtils.isBlank(refundBeginTime) || DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, log.getRefundDate()+" 00:00:00").getTime() < + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, refundBeginTime).getTime()) { + refundBeginTime = log.getRefundDate()+" 00:00:00"; + } + if (StringUtils.isBlank(refundEndTime) || DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, log.getRefundDate()+" 23:59:59").getTime() > + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, refundEndTime).getTime()) { + refundEndTime = log.getRefundDate()+" 23:59:59"; + } + } + } + } + if (refundTrxnbrs.size() > 0) { + StringBuffer sf = new StringBuffer(""); + for (String code : refundTrxnbrs.keySet()) { + if ("".equals(sf.toString())) { + sf.append("'" + code + "'"); + } else { + sf.append("," + "'" + code + "'"); + } + } + List refundTrxnbrList = accountLogDao.selectNarinnByAccId(syn.getId(), sf.toString(), refundBeginTime, refundEndTime); + for (AccountLog l : refundTrxnbrList) { + refundTrxnbrs.get(l.getTrxnbr()).setNarinn(l.getNarinn()); + } + } + int batchSize = BussinessVariable.getMaxSizeOfInsert(17);//每批插入条数 + int batchNum = (int)Math.ceil(syn.getLogs().size()/(double)batchSize); + for (int i = 0,total = syn.getLogs().size(); i < batchNum; i++) { + int fromIndex = i * batchSize;//list中开始索引 + int toIndex = fromIndex + batchSize;//list中结束索引 + if(toIndex >= total) + toIndex = total; + accountLogDao.insertAll(syn.getLogs().subList(fromIndex, toIndex)); + } + if(balanceChange) { + Account accUpd = new Account(); + accUpd.setId(syn.getId()); + accUpd.setBalance(syn.getBalance()); + accUpd.setEditTime(new Date()); + accountDao.updateByPrimaryKeySelective(accUpd); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java new file mode 100644 index 0000000..4292eff --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java @@ -0,0 +1,665 @@ +package org.dromara.settlement.service.impl; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongConfig; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongResponse; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongUtil; +import org.dromara.settlement.common.file.FileUtils; +import org.dromara.settlement.common.file.SftpUtils; +import org.dromara.settlement.common.file.ZipUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.SftpException; + +@Service +public class JitaoTongServiceImpl { + private Logger log = LoggerFactory.getLogger(JitaoTongServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + private JiaoTongResponse request(long unitId, String funcode, StringBuilder body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private JiaoTongResponse request(long unitId, String funcode, StringBuilder body, boolean record, Long tranId) { + JiaoTongResponse response = null; + JiaoTongConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = JiaoTongUtil.getInstance().request(config, funcode, reqid, body.toString()); + if (record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = JiaoTongUtil.getInstance().response(config, requsetRtn.getRtnData()); + if (record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if (record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private JiaoTongConfig getBankConfig(long unitId) { + JiaoTongConfig config = new JiaoTongConfig(); + if (wConfigService != null && unitId > 0) { + config.CorpNo = wConfigService.getItem(unitId, "jiaotong_corpno"); + config.UserNo = wConfigService.getItem(unitId, "jiaotong_userno"); + config.SUPERACC = wConfigService.getItem(unitId, "jiaotong_super_acc"); + config.URL = wConfigService.getItem(unitId, "jiaotong_api"); + config.PAYTYPE = wConfigService.getItem(unitId, "jiaotong_pay_type"); + config.CUSTNO = wConfigService.getItem(unitId, "jiaotong_cust_no"); + config.CALLBACKHOST = wConfigService.getItem(unitId, "jiaotong_callback_host"); + config.CALLBACKPORT = wConfigService.getItem(unitId, "jiaotong_callback_port"); + config.CALLBACKNAME = wConfigService.getItem(unitId, "jiaotong_callback_name"); + config.CALLBACKPASSWORD = wConfigService.getItem(unitId, "jiaotong_callback_password"); + config.SUPERACCNAME = wConfigService.getItem(unitId, "jiaotong_super_acc_name"); + if (StringUtils.isBlank(config.SUPERACCNAME)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.CorpNo + "," + config.UserNo); + } + return config; + } + + /** + * 创建交通银行云账户 + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 云账户编号 + * @param name 云账户名称 + * @param prefix 云账户编号前缀 + */ + public Account createAccount(long unitId, String code, String name, String prefix) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(unitId); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + body.append("").append(1).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(code).append(""); + body.append("").append(config.SUPERACC+"-"+code).append(""); + body.append("").append(config.SUPERACCNAME).append(""); + body.append("").append(name).append(""); + body.append("").append(1).append(""); + body.append("").append(1).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + body.append("").append(0).append(""); + body.append("").append(0).append(""); + body.append("").append(1).append(""); + body.append("").append(0).append(""); + JiaoTongResponse res = request(unitId, "710713", body, false); + if (res != null && (res.getResultcode().equals("0000") || res.getResultcode().equals("0084"))) { + Account account = new Account(); + account.setBankType("交通银行"); + account.setBankTypeName("交通银行"); + account.setBankCard(config.SUPERACC+"-"+code); + account.setBalance(0l); + return account; + } + return null; + } + + /** + * 同步交通银行账户 + * + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + public AccountSyn synAccount(AccountSyn acc) { + StringBuilder body = new StringBuilder(); + String curDate = DateUtils.getDate(); + String synDate = null;// 最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + } else { + synDate = curDate; + } + body.append("").append(acc.getBankCard()).append(""); + body.append("").append(2).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + JiaoTongResponse res = request(acc.getUnitId(), "710714", body, false); + if (res != null) { + String record_num = "0"; + if(!res.getResultcode().equals("2018")) {//非无符合条件的记录 + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行账户失败"); + } + record_num = res.getData().elementText("record_num"); + } + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (Map item : list) { + String frmcod = item.containsKey("账号") ? item.get("账号") : ""; + if (frmcod.equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + log.setRpyacc(item.containsKey("对方账号") ? item.get("对方账号") : null); + log.setRpynam(item.containsKey("对方户名") ? item.get("对方户名") : null); + String trxtim = item.get("交易时间"); + String trxdat = item.containsKey("交易日期") ? item.get("交易日期") : ""; + if (StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0, 4) + "-" + trxdat.substring(4, 6) + "-" + + trxdat.substring(6, 8) + " " + trxtim.substring(0, 2) + ":" + + trxtim.substring(2, 4) + ":" + trxtim.substring(4, 6); + } else { + trxtim = curDate + " " + trxtim.substring(0, 2) + ":" + trxtim.substring(2, 4) + ":" + + trxtim.substring(4, 6); + } + log.setTranTime( + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.get("交易金额")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(item.get("会计流水号")); + String trxdir = item.get("借贷标志"); + String narinn = null; + if (item.containsKey("传票业务摘要区")) { + if (item.get("传票业务摘要区").indexOf("〉〉") != -1) { + String[] trxtxtArr = item.get("传票业务摘要区").split("〉〉"); + narinn = trxtxtArr[0]; + log.setTrxtxt(trxtxtArr[trxtxtArr.length-1]); + }else { + log.setTrxtxt(item.get("传票业务摘要区")); + } + if (log.getTrxtxt().equals("代收小额支付业务手续费")) { + //手续费的会计流水号与当笔交易相同,这里做兼容处理 + log.setTrxnbr(log.getTrxnbr()+"-1"); + } + } + if (trxdir.equals("D")) { + log.setTrxamt(-log.getTrxamt()); + log.setTrxdir((short) 2); + } else if (trxdir.equals("C")) { + log.setTrxdir((short) 1); + String narinnStr = item.containsKey("备用字段1") ? item.get("备用字段1") : null; + if (StringUtils.isNotBlank(narinnStr)) { + String[] narinnStrArr = narinnStr.split("#"); + if (narinnStrArr[0].equals("1") && narinnStrArr.length > 2) {//退汇 + log.setRefundDate(narinnStrArr[1].substring(0, 4) + "-" + narinnStrArr[1].substring(4, 6) + "-" + + narinnStrArr[1].substring(6, 8)); + log.setRefundTrxnbr(narinnStrArr[2]); + } + } + } + log.setNarinn(narinn); + log.setBalance(acc.getBalance()); + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs() + ","); + } + acc.setTrxnbrs(acc.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + } + } + } + // 不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate, 1); + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(log.getSourceAccName()).append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? 0 : 1).append(""); + body.append("").append(log.getBankType()).append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getRemark()).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "710716", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + this.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @param busiNo 代发协议编号 + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log,String busiNo) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(config.PAYTYPE).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append("").append(DateUtils.parseDateToString("yyyyMM", new Date())).append(""); + body.append("").append(busiNo).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? "A" : "B").append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append("").append(log.getOrderNo()+"〉〉"+log.getRemark()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "330012", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "代发转账失败"); + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog transfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(log.getSourceAccName()).append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? 0 : 1).append(""); + body.append("").append(log.getBankType()).append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getRemark()).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "710716", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "转账失败"); + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步对私银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synPersionTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + body.append("").append("A").append(""); + JiaoTongResponse res = request(log.getUnitId(), "310404", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行对私交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("状态")) { + if (list.get(0).get("状态").equals("F")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("状态").equals("E")) { + log.setResult((short) 3); + if(list.get(0).containsKey("错误原因")) { + log.setReason(list.get(0).get("错误原因")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710717", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("交易状态")) { + if (list.get(0).get("交易状态").equals("0")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("交易状态").equals("3")) { + log.setResult((short) -1); + if(list.get(0).containsKey("备用字段1")) { + log.setReason(list.get(0).get("备用字段1")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710717", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("交易状态")) { + if (list.get(0).get("交易状态").equals("0")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("交易状态").equals("3")) { + log.setResult((short) 3); + if(list.get(0).containsKey("备用字段1")) { + log.setReason(list.get(0).get("备用字段1")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + public String getTransferCallback(TransactionLog log) throws IOException, InterruptedException { + String callBackFile = ""; + String synDate = DateUtils.parseDateToString(DateUtils.YYYYMMDD,log.getTranTime()); + String lockKey = "jiaotongback:"+log.getUnitId()+":"+synDate; + RLock lock = RedisUtils.getClient().getLock(lockKey); + if(lock.tryLock(1000*60*30, TimeUnit.MILLISECONDS)) { + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId())+"/"; + String flName = config.CUSTNO+"_"+synDate+".zip"; + String saveFile = uploadPhyPath + flName; + File saveFileObj = new File(saveFile); + if(!saveFileObj.exists()) { + saveFileObj = null; + SftpUtils sftpUtils = new SftpUtils(); + ChannelSftp sftp = null; + try { + String directory = "/"; + sftp = sftpUtils.connect(config.CALLBACKHOST, Integer.parseInt(config.CALLBACKPORT), config.CALLBACKNAME, config.CALLBACKPASSWORD); + if (sftpUtils.isExist(directory, flName, sftp)) { + if(sftpUtils.download(directory, flName, saveFile, sftp)) { + saveFileObj = new File(saveFile); + sftpUtils.delete(directory, flName, sftp); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + this.log.error("下载交通银行交易回置单文件出错("+flName+"):",e); + } finally { + sftpUtils.disconnect(config.CALLBACKHOST, sftp); + } + } + if (saveFileObj != null) { + String descDir = saveFile.substring(0,saveFile.lastIndexOf("."))+"/"; + ZipUtils.unZipFiles(saveFile, descDir); + File dir = new File(descDir); + File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 + if (files != null) { + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + //回执单列表 + Map callBackFileList = new HashMap(); + for (int i = 0,len = files.length; i < len; i++) { + String fileName = files[i].getName(); + if (files[i].isFile() && fileName.endsWith(".zip")) { // 判断是文件 + String fileDir = descDir + fileName.substring(0,fileName.lastIndexOf("."))+"/"; + ZipUtils.unZipFiles(descDir+fileName, fileDir); + String payListFile = fileDir + fileName.substring(0,fileName.lastIndexOf("."))+".txt"; + List> payList = JiaoTongUtil.getInstance().getMutiAreaData(FileUtils.readTxtFile(payListFile,"|"), 12); + for (Map pay : payList) { + if (pay.get("!借贷标志").equals("!借方")) { + String key = pay.get("!会计流水号").substring(1); + //主账户下的回执单:代发的收款人是真实收款人 + //云账户下的回执单:代发的收款人是主账户 + //会计流水号不存在,或属于主账户下的回执单(同一会计流水号会存在多个账户文件夹中) + String payReceipt = fileDir.replace(uploadPhyPath, uploadNetPath)+pay.get("回单日期")+"_"+pay.get("!回单编号").substring(1)+"_"+key+".pdf"; + if (!callBackFileList.containsKey(key)) { + TransactionLog callBack = new TransactionLog(); + callBack.setTargetBankNo(key); + callBack.setPayReceipt(payReceipt); + callBackFileList.put(key, callBack); + }else if (callBackFileList.containsKey(key) && fileName.indexOf("-") == -1) { + callBackFileList.get(key).setPayReceipt(payReceipt); + } + } + } + } + } + transactionLogDao.updatePayReceipt("交通银行", new ArrayList(callBackFileList.values())); + if (callBackFileList.containsKey(log.getTargetBankNo())) { + callBackFile = callBackFileList.get(log.getTargetBankNo()).getPayReceipt(); + } + } + } + lock.unlock(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + String result = ""; + if(log.getTranTime() != null) { + StringBuilder body = new StringBuilder(); + //同步到结果的日期(结束日期) + String synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + //开始日期(解决同步到结果的日期与银行出结果的时间差问题) + String startDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, DateUtils.addOneHour(log.getTranTime(), -1)); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(2).append(""); + body.append("").append(startDate.replace("-", "")).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710714", body, false); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易流水号失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + for (Map item : list) { + String frmcod = item.containsKey("账号") ? item.get("账号") : ""; + if (frmcod.equals(log.getSourceCard())) { + String narinn = null; + if (item.get("传票业务摘要区").indexOf("〉〉") != -1) { + narinn = item.get("传票业务摘要区").split("〉〉")[0]; + } + if (StringUtils.isNotBlank(narinn) && narinn.equals(log.getOrderNo())) { + result = item.get("会计流水号"); + break; + } + } + } + } + } + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java new file mode 100644 index 0000000..47878a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java @@ -0,0 +1,719 @@ +package org.dromara.settlement.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.SftpException; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.minsheng.FileEncryptAndDecryptUtil; +import org.dromara.settlement.common.bank.minsheng.MinShengConfig; +import org.dromara.settlement.common.bank.minsheng.MinShengResponse; +import org.dromara.settlement.common.bank.minsheng.MinShengUtil; +import org.dromara.settlement.common.file.SftpUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +public class MinShengServiceImpl { + private Logger log = LoggerFactory.getLogger(MinShengServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + private MinShengResponse request(long unitId, String funcode, String body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private MinShengResponse request(long unitId, String funcode, String body, boolean record, Long tranId) { + MinShengResponse response = null; + MinShengConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = MinShengUtil.getInstance().request(config, funcode, reqid, body); + if (record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = MinShengUtil.getInstance().response(config, requsetRtn.getRtnData()); + if (record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if (record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private MinShengConfig getBankConfig(long unitId) { + MinShengConfig config = new MinShengConfig(); + if (wConfigService != null && unitId > 0) { + config.merchantNum = wConfigService.getItem(unitId, "minsheng_bank_merchantNum"); + config.systemCode = wConfigService.getItem(unitId, "minsheng_bank_systemCode"); + String uploadPhyPath = wConfigService.getUploadPhyPath(unitId) + "/"; + config.rsaCertPath = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_rsaCertPath"); + config.rsaCertPsword = wConfigService.getItem(unitId, "minsheng_bank_rsaCertPsword"); + config.URL = wConfigService.getItem(unitId, "minsheng_bank_api"); + config.sm2CmbcPubCert = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_sm2CmbcPubCert"); + config.sm2MhtPriCertPath = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_sm2MhtPriCertPath"); + config.sm2MhtPriCertPsword = wConfigService.getItem(unitId, "minsheng_bank_sm2MhtPriCertPsword"); + config.CALLBACKHOST = wConfigService.getItem(unitId, "minsheng_bank_callback_host"); + config.CALLBACKPORT = wConfigService.getItem(unitId, "minsheng_bank_callback_port"); + config.CALLBACKNAME = wConfigService.getItem(unitId, "minsheng_bank_callback_name"); + config.CALLBACKPASSWORD = wConfigService.getItem(unitId, "minsheng_bank_callback_password"); + config.CALLBACKDIRECTORY = wConfigService.getItem(unitId, "minsheng_bank_callback_directory"); + config.customerSignId = wConfigService.getItem(unitId, "minsheng_bank_customerSignId"); + config.acctNo = wConfigService.getItem(unitId, "minsheng_bank_acctNo"); + if (StringUtils.isBlank(config.merchantNum)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.merchantNum + "," + config.systemCode); + } + return config; + } + + /** + * 创建民生银行云账户 + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 云账户编号 + * @param name 云账户名称 + * @param prefix 云账户编号前缀 + * @param bindAcctNo 绑卡账户号码(真实公户) + * @param bindAcctName 绑卡账户名称(真实公户) + */ + public Account createAccount(long unitId,String code,String name,String prefix,String bindAcctNo,String bindAcctName) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("vacctBusiId",code); + body.put("vacctBusiName",name); + body.put("isApprove",0); + body.put("isBindAcct",1); + body.put("bindAcctNo",bindAcctNo); + body.put("bindAcctName",bindAcctName); + MinShengResponse res = request(unitId, "EIST_T01010401", body.toJSONString(), false); + if (res != null && (res.getResultcode().equals("S") || "EIPSC_D_Q005000_E00010".equals(res.getRespCode()))) { + if("EIPSC_D_Q005000_E00010".equals(res.getRespCode())){ + JSONObject old = getAccount(unitId,code); + if (old == null){ + throw new ServiceException("民生银行子账户修改时不存在"); + } + updateAccount(unitId,old,bindAcctNo,bindAcctName); + res.setData(old); + } + Account account = new Account(); + account.setBankType("民生银行"); + account.setBankTypeName("民生银行"); + account.setBankCard(res.getData().getString("vacctNo")); + account.setName(res.getData().getString("vacctName")); + account.setBalance(0l); + return account; + } + return null; + } + + public void updateAccount(long unitId,JSONObject old,String bindAcctNo,String bindAcctName) { + if(!old.getString("bindAcctNo").equals(bindAcctNo) || !old.getString("bindAcctName").equals(bindAcctName)) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + body.put("customerSignId", config.customerSignId); + body.put("vacctNo", old.getString("vacctNo")); + body.put("operType", 2); + body.put("bindAcctNo", bindAcctNo); + body.put("bindAcctName", bindAcctName); + MinShengResponse res = request(unitId, "EIST_T01000410", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "修改民生银行子账户失败"); + } + } + } + } + + public JSONObject getAccount(long unitId,String code) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("bindFlag",1); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(unitId, "EIST_Q01010402", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "查询民生银行子账户失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(StringUtils.isNotBlank(item.getString("vacctBusiId"))) { + if (item.getString("vacctBusiId").equals(code)) { + return item; + } + }else{ + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + return null; + } + + /** + * 同步民生银行账户 + * + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + public AccountSyn synAccount(AccountSyn acc) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(acc.getUnitId()); + String curDate = DateUtils.getDate(); + String synDate = null;// 最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + } else { + synDate = curDate; + } + body.put("customerSignId",config.customerSignId); + body.put("vacctNo",acc.getBankCard()); + body.put("dateFrom",synDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + boolean continueSyn = true;//是否继续同步 + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(acc.getUnitId(), "EIST_Q01000404", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + continueSyn = false; + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行账户失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + if(acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(StringUtils.isNotBlank(item.getString("transSeqNo"))) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + log.setRpyacc(item.containsKey("otherAcctNo") ? item.getString("otherAcctNo") : null); + log.setRpynam(item.containsKey("otherAcctName") ? item.getString("otherAcctName") : null); + String trxtim = item.getString("transTime"); + String trxdat = item.containsKey("transDate") ? item.getString("transDate") : ""; + if (StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0, 4) + "-" + trxdat.substring(4, 6) + "-" + + trxdat.substring(6, 8) + " " + trxtim.substring(0, 2) + ":" + + trxtim.substring(2, 4) + ":" + trxtim.substring(4, 6); + } else { + trxtim = curDate + " " + trxtim.substring(0, 2) + ":" + trxtim.substring(2, 4) + ":" + + trxtim.substring(4, 6); + } + log.setTranTime( + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.getString("transAmt")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(item.getString("transSeqNo")); + String trxdir = item.getString("dcFlag"); + String narinn = null; + if (trxdir.equals("1")) { + log.setTrxamt(-log.getTrxamt()); + log.setTrxdir((short) 2); + } else if (trxdir.equals("2")) { + log.setTrxdir((short) 1); + String postscript = item.getString("postscript"); + log.setTrxtxt(postscript); + if (item.getString("detStat").equals("00") && StringUtils.isNotBlank(postscript) && postscript.indexOf("退汇") != -1) { + //验证退汇的情况 + JSONObject refund = getRefund(acc, synDate, item.getString("otherAcctNo"),item.getString("otherAcctName"),item.getString("transAmt")); + if (refund != null) {//退汇 + TransactionLog oldLog = transactionLogDao.selectBySourceBankNo(acc.getBankCard(), refund.getString("oriApplyId")); + log.setRefundDate(refund.getString("refundTime").substring(0, 10)); + log.setRefundTrxnbr(oldLog.getOrderNo()); + narinn = oldLog.getOrderNo(); + } + } + } + log.setNarinn(narinn); + log.setBalance(acc.getBalance()); + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs() + ","); + } + acc.setTrxnbrs(acc.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + }else{ + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + if(continueSyn){ + // 不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate, 1); + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 获取民生银行退汇信息 + * @param acc 子账簿信息 + * @param synDate 退汇日期 + * @param oriPayeeAcctNo 退汇账号 + * @param oriPayeeAcctName 退汇账号名称 + * @param oriTransAmt 退汇金额 + * @return + */ + public JSONObject getRefund(AccountSyn acc,String synDate,String oriPayeeAcctNo,String oriPayeeAcctName,String oriTransAmt) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(acc.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("oriDraweeVacctNo",acc.getBankCard()); + body.put("dateFrom",synDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(acc.getUnitId(), "EIST_Q01000415", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取民生银行退汇信息失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(oriPayeeAcctNo.equals(item.getString("oriPayeeAcctNo")) && oriPayeeAcctName.equals(item.getString("oriPayeeAcctName")) && oriTransAmt.equals(item.getString("oriTransAmt"))) { + return item; + }else { + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + return null; + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeVacctNo",log.getTargetCard()); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + body.put("summary",log.getOrderNo()); + body.put("postscript",log.getRemark()); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000406", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + this.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + log.setSourceBankNo(res.getReqSeq()); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeAcctNo",log.getTargetCard()); + body.put("payeeAcctName",log.getTargetAccName()); + body.put("payeeAcctType",1); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + String remark = log.getRemark().replace("代发服务费","服务费"); + body.put("postscript",remark); + body.put("summary",log.getOrderNo()+"〉〉"+remark); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000404", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "代发转账失败"); + } + log.setSourceBankNo(res.getData().getString("applyId")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对公转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @param targetKhhNo 收款人开户行行号 + * @return + */ + public TransactionLog transfer(TransactionLog log,String targetKhhNo) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeBankNo",targetKhhNo); + body.put("payeeAcctNo",log.getTargetCard()); + body.put("payeeAcctName",log.getTargetAccName()); + body.put("payeeAcctType",0); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + body.put("postscript",log.getRemark()); + body.put("summary",log.getOrderNo()+"〉〉"+log.getRemark()); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000404", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "转账失败"); + } + log.setSourceBankNo(res.getData().getString("applyId")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + body.put("channelReqSeq",log.getSourceBankNo()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000409", body.toJSONString(), false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行子账户间交易结果失败"); + } + if (res.getData().getString("transStatus").equals("02")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (res.getData().getString("transStatus").equals("03")) { + log.setResult((short) -1); + if (StringUtils.isNotEmpty(res.getData().getString("postscript"))) { + log.setReason(res.getData().getString("postscript")); + } + if(StringUtils.isNotEmpty(log.getReason())){ + log.setReason(log.getReason() + "、"); + } + if (StringUtils.isNotEmpty(res.getData().getString("summary"))) { + log.setReason(log.getReason() + res.getData().getString("summary")); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + body.put("applyId",log.getSourceBankNo()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000405", body.toJSONString(), false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行对私交易结果失败"); + } + if (res.getData().getString("transStatus").equals("02")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (res.getData().getString("transStatus").equals("03")) { + log.setResult((short) 3); + log.setReason(res.getData().getString("retMsg")); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + public String getTransferCallback(TransactionLog log) throws IOException, InterruptedException { + String callBackFile = ""; + String synDate = DateUtils.parseDateToString(DateUtils.YYYYMMDD,log.getTranTime()); + String lockKey = "minsheng:"+log.getUnitId()+":"+synDate; + RLock lock = RedisUtils.getClient().getLock(lockKey); + if(lock.tryLock(1000*60*30, TimeUnit.MILLISECONDS)) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + if(StringUtils.isBlank(log.getPayReceiptId())) { + body.put("customerSignId",config.customerSignId); + body.put("transSeqNo",log.getTargetBankNo()); + body.put("transDate",synDate); + body.put("acctNo",config.acctNo); + MinShengResponse res = request(log.getUnitId(), "EIST_T01010301", body.toJSONString(), false); + if (res != null) { + if (res.getResultcode().equals("S")) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(res.getReqSeq()); + transactionLogDao.updateByPrimaryKeySelective(upd); + log.setPayReceiptId(upd.getPayReceiptId()); + } + } + } + if(StringUtils.isNotBlank(log.getPayReceiptId())) { + body = new JSONObject(); + body.put("channelReqSeq",log.getPayReceiptId()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01010302", body.toJSONString(), false); + if (res != null) { + if (res.getResultcode().equals("S")) { + if("3".equals(res.getData().getString("status"))){ + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(""); + transactionLogDao.updateByPrimaryKeySelective(upd); + }else if("2".equals(res.getData().getString("status"))) { + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId()) + "/"; + String flName = res.getData().getString("fileName"); + String saveFile = uploadPhyPath + config.acctNo + flName; + File saveFileObj = new File(saveFile); + if (!saveFileObj.exists()) { + saveFileObj = null; + SftpUtils sftpUtils = new SftpUtils(); + ChannelSftp sftp = null; + try { + String directory = "/"; + if(StringUtils.isNotBlank(config.CALLBACKDIRECTORY)){ + directory += config.CALLBACKDIRECTORY + "/"; + } + sftp = sftpUtils.connect(config.CALLBACKHOST, Integer.parseInt(config.CALLBACKPORT), config.CALLBACKNAME, config.CALLBACKPASSWORD); + if (sftpUtils.isExist(directory, flName, sftp)) { + String downloadFileName = "encrypt"+config.acctNo + flName; + if (sftpUtils.download(directory, flName, uploadPhyPath + downloadFileName, sftp)) { + FileEncryptAndDecryptUtil.decryptFile(downloadFileName,uploadPhyPath,config.sm2MhtPriCertPath,config.sm2MhtPriCertPsword,saveFile); + saveFileObj = new File(saveFile); + if(saveFileObj.exists()) { + sftpUtils.delete(directory, flName, sftp); + }else{ + saveFileObj = null; + } + new File(uploadPhyPath + downloadFileName).delete(); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + this.log.error("下载民生银行交易回置单文件出错(" + flName + "):", e); + } finally { + sftpUtils.disconnect(config.CALLBACKHOST, sftp); + } + } + if (saveFileObj != null) { + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + //回执单列表 + List callBackFileList = new ArrayList(); + TransactionLog callBack = new TransactionLog(); + callBack.setTargetBankNo(log.getTargetBankNo()); + callBack.setPayReceipt(saveFile.replace(uploadPhyPath, uploadNetPath)); + callBackFileList.add(callBack); + transactionLogDao.updatePayReceipt("民生银行", callBackFileList); + callBackFile = callBack.getPayReceipt(); + } + } + } + } + } + lock.unlock(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + return log.getSourceBankNo().substring(0,23); + /*if(log.getTranTime() != null) { + //同步到结果的日期(结束日期) + String synDate = DateTimeUtils.parseDateToString(DateTimeUtils.pattern_yyyy_MM_dd, log.getTranTime()); + //开始日期(解决同步到结果的日期与银行出结果的时间差问题) + String startDate = DateTimeUtils.parseDateToString(DateTimeUtils.pattern_yyyy_MM_dd, DateTimeUtils.addOneHour(log.getTranTime(), -1)); + + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("vacctNo",log.getSourceCard()); + body.put("dateFrom",startDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000404", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行交易流水号失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + String summary = item.getString("summary"); + if (summary.indexOf("〉〉") != -1) { + String[] summaryArr = summary.split("〉〉"); + if (summaryArr[0].equals(log.getOrderNo())){ + return item.getString("transSeqNo").substring(0,23); + } + } + } + page++; + } + } + }while (listSize > 0); + } + return "";*/ + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java new file mode 100644 index 0000000..76484fe --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.settlement.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.internal.util.AlipaySignature; +import com.fasterxml.jackson.core.type.TypeReference; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoConfig; +import org.dromara.settlement.mapper.AccountMapper; +import org.dromara.settlement.mapper.AccountSynMapper; +import org.dromara.settlement.mapper.SignZhifubaoMapper; +import org.dromara.settlement.service.IPublicService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.*; + +@Service("publicServiceImpl") +public class PublicServiceImpl implements IPublicService { + private static final Logger log = LoggerFactory.getLogger(PublicServiceImpl.class); + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl; + + @Autowired + private AccountServiceTransactionImpl transactionImpl; + + @Autowired + private SignZhifubaoMapper signZhifubaoDao;//支付宝签约信息 + + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountSynMapper accountSynDao;//银行账户同步dao + + @Override + public String zfbNotify(Map paramss) { + // TODO 自动生成的方法存根 + String ret = "success"; + try { + if(paramss.size() > 0 && paramss.containsKey("app_id")) { + SignZhifubao sign = signZhifubaoDao.selectByAppId(paramss.get("app_id")); + if(sign != null) { + long unitId = sign.getUnitId(); + ZhiFuBaoConfig config = zhiFuBaoServiceImpl.getBankConfig(unitId); + if(AlipaySignature.certVerifyV1(paramss, config.alipayCertPublicKey, "UTF-8", "RSA2")) { + Map params = JSONObject.parseObject(paramss.get("biz_content"), Map.class); + if(params.containsKey("payee_identity_type") && params.get("payee_identity_type").equals("ACCOUNT_BOOK_ID")) {//记账本 + Account acc = accountDao.selectByArgNoAndType(unitId, "支付宝", params.get("payee_identity")); + if (acc == null) { + log.info("银行账户的支付宝协议编号["+params.get("payee_identity")+"]不存在,延迟接收支付宝充值通知"); + return "fail"; + } + AccountSyn syn = accountSynDao.selectByPrimaryKey(acc.getId()); + if (syn == null) { + syn = new AccountSyn(); + syn.setId(acc.getId()); + syn.setUnitId(acc.getUnitId()); + syn.setType(acc.getType()); + syn.setBankCard(acc.getBankCard()); + syn.setBankType(acc.getBankType()); + syn.setType(acc.getType()); + syn.setSynLock((byte)0); + accountSynDao.insertSelective(syn); + } + syn.setBalance(acc.getBalance()); + syn.setAddAmount(0l); + syn.setReductionAmount(0l); + syn.setTrxnbrs(""); + AccountLog log = new AccountLog(); + log.setAccId(syn.getId()); + log.setAddBy("系统"); + log.setAddTime(new Date()); + log.setBankCard(syn.getBankCard()); + log.setBankType(syn.getBankType()); + log.setRpyacc(params.get("payer_identity")); + log.setRpynam(params.get("payer_name")); + log.setTranTime(log.getAddTime()); + log.setTrxamt(new BigDecimal(params.get("amount")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(params.get("order_no")); + log.setTrxdir((short) 1); + log.setBalance(syn.getBalance()); + log.setUnitId(syn.getUnitId()); + syn.setLogs(new ArrayList()); + syn.getLogs().add(log); + if (StringUtils.isNotBlank(syn.getTrxnbrs())) { + syn.setTrxnbrs(syn.getTrxnbrs() + ","); + } + syn.setTrxnbrs(syn.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + transactionImpl.saveAccountLog(syn); + } + } + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝充值通知解析出错("+JSONObject.toJSONString(paramss)+"):",e); + ret = "fail"; + } + return ret; + } + + @Override + public String signNotify(Map paramss) { + // TODO 自动生成的方法存根 + Map params = null; + String ret = "success"; + try { + //params = getParamMap(request); + if(params.size() > 0) { + long unitId = Long.parseLong(params.get("external_agreement_no")); + ZhiFuBaoConfig config = zhiFuBaoServiceImpl.getBankConfig(unitId); + if(AlipaySignature.certVerifyV1(params, config.alipayCertPublicKey, "UTF-8", "RSA2")) { + SignZhifubao upd = new SignZhifubao(); + upd.setAgreementNo(params.get("agreement_no")); + upd.setAlipayLogonId(params.get("alipay_logon_id")); + upd.setAppId(params.get("app_id")); + upd.setSignTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, params.get("sign_time"))); + upd.setStatus(params.get("status")); + upd.setUnitId(unitId); + upd.setValidTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, params.get("valid_time"))); + upd.setEditTime(new Date()); + upd.setAddTime(upd.getEditTime()); + Integer row = signZhifubaoDao.insertSelective(upd); + if (row == 0) { + upd.setAddTime(null); + signZhifubaoDao.updateByAppId(upd); + } + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝签约通知解析出错("+JSONObject.toJSONString(params)+"):",e); + ret = "fail"; + } + return ret; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java new file mode 100644 index 0000000..5479e39 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java @@ -0,0 +1,833 @@ +package org.dromara.settlement.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Date; + +import com.alibaba.nacos.shaded.com.google.gson.JsonArray; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangConfig; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangResponse; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangUtil; +import org.dromara.settlement.common.file.FileUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class ZhaoShangServiceImpl +{ + private static final Logger log = LoggerFactory.getLogger(ZhaoShangServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private SysLogMapper sysLogDao;//日志 + + + @DubboReference + private RemoteFileService remoteFileService; + + private ZhaoShangResponse request(long unitId, String funcode, JsonObject body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private ZhaoShangResponse request(long unitId,String funcode,JsonObject body,boolean record,Long tranId) { + ZhaoShangResponse response = null; + ZhaoShangConfig config = getZhaoShangConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if(record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if(record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = ZhaoShangUtil.getInstance().request(config,funcode, reqid, body); + if(record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = ZhaoShangUtil.getInstance().response(config,requsetRtn.getRtnData()); + if(record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if(record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if(record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + }else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private ZhaoShangConfig getZhaoShangConfig(long unitId) { + ZhaoShangConfig config = new ZhaoShangConfig(); + if (wConfigService != null && unitId > 0) { + config.ACCNBR = wConfigService.getItem(unitId, "zhaoshang_accnbr"); + config.AESKEY = wConfigService.getItem(unitId, "zhaoshang_aeskey"); + config.prikeyStr = wConfigService.getItem(unitId, "zhaoshang_prikey"); + config.pubkeyStr = wConfigService.getItem(unitId, "zhaoshang_pubkey"); + config.UID = wConfigService.getItem(unitId, "zhaoshang_uid"); + config.URL = wConfigService.getItem(unitId, "zhaoshang_api"); + config.BBKNBR = wConfigService.getItem(unitId, "zhaoshang_bbknbr"); + config.KHH = wConfigService.getItem(unitId, "zhaoshang_khh"); + config.LHH = wConfigService.getItem(unitId, "zhaoshang_llh"); + if (StringUtils.isBlank(config.BBKNBR)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置("+unitId+"):"+config.ACCNBR+","+config.UID+","+config.AESKEY); + } + return config; + } + + /** + * 创建招商银行记账子单位(虚拟账户) + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 记账子单元编号 + * @param name 记账子单元名称 + * @param prefix 记账子单元编号前缀 + */ + public Account createAccount(long unitId,String code,String name,String prefix) { + JsonObject body = new JsonObject(); + JsonObject ntdmaaddx = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(unitId); + ntdmaaddx.addProperty("accnbr", config.ACCNBR); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + ntdmaaddx.addProperty("dmanbr", code); + ntdmaaddx.addProperty("dmanam", name); + ntdmaaddx.addProperty("ovrctl", "N"); + ntdmaaddx.addProperty("bcktyp", "Y"); + ntdmaaddx.addProperty("clstyp", "N"); + body.add("ntdmaaddx", ntdmaaddx); + ZhaoShangResponse res = request(unitId,"NTDMAADD", body,false); + if (res != null) { + //新开通主账户,发现code存在时,Resultcode不一致,所以这里也用中文判断了 + if (res.getResultcode().equals("SUC0000") || res.getResultcode().equals("NCB6608") || (StringUtils.isNotBlank(res.getResultmsg()) && res.getResultmsg().indexOf("子单元编号已存在") != -1)) {//成功或已存在 + Account account = new Account(); + account.setBankType("招商银行"); + account.setBankTypeName("招商银行"); + account.setBankNo(config.LHH); + account.setBankName(config.KHH); + account.setBankCard(config.ACCNBR + code); + account.setBalance(0l); + return account; + } + } + return null; + } + + + + public AccountSyn synAccountNew(AccountSyn acc) { + try{ + Thread.sleep(1000*10); + }catch (Exception e){ + + } + JsonObject body = new JsonObject(); + String curDate = DateUtils.getDate(); + String synDate = null;//最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + if (StringUtils.isBlank(acc.getSynPosition()) && DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //如果交易日同步完成,则开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate,1); + } + }else { + synDate = curDate; + } + ZhaoShangConfig config = getZhaoShangConfig(acc.getUnitId()); + + JsonObject ntdmtqrdy1 = new JsonObject(); + ntdmtqrdy1.addProperty("bbknbr", config.BBKNBR); + ntdmtqrdy1.addProperty("inbacc", config.ACCNBR); + ntdmtqrdy1.addProperty("dyanbr", acc.getBankCard().replace(config.ACCNBR,"")); + String funcode = "NTDMTQRD"; + if (StringUtils.isNotBlank(acc.getSynPosition())) { + ntdmtqrdy1.addProperty("ctnkey", acc.getSynPosition()); + } + + if(!curDate.equals(synDate)){ + ntdmtqrdy1.addProperty("begdat",synDate.replaceAll("-","")); + ntdmtqrdy1.addProperty("enddat",synDate.replaceAll("-","")); + funcode ="NTDMTQRY"; + body.add("ntdmtqryy1",ntdmtqrdy1); + }else{ + body.add("ntdmtqrdy1",ntdmtqrdy1); + } + + ZhaoShangResponse res = request(acc.getUnitId(),funcode, body,false); + String todaySynPosition = ""; + if (res != null) { + JsonArray rtnBody = null; + if(res.getData().has("ntdmtqryz1")) { + rtnBody = res.getData().getAsJsonArray("ntdmtqryz1"); + } + if(res.getData().has("ntdmtqryy1")) { + JsonArray ntdmtlsty = res.getData().getAsJsonArray("ntdmtqryy1"); + JsonObject ntdmtlstyItem = ntdmtlsty.get(0).getAsJsonObject(); + todaySynPosition = ntdmtlstyItem.get("ctnkey").getAsString(); + if(StringUtils.isEmpty(todaySynPosition)) {//已查完交易日的所有交易 + acc.setSynPosition(""); + }else { + acc.setSynPosition(todaySynPosition); + } + }else { + acc.setSynPosition(""); + } + if (rtnBody != null && rtnBody.size() > 0) { + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0, len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + String frmcod = item.has("dyanbr") ? item.get("dyanbr").getAsString() : ""; + if ((config.ACCNBR + frmcod).equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + //log.setCcynbr(item.getString("ccynbr")); + //R:冲账,冲正标志 + log.setMthflg(item.has("rvstag") ? item.get("rvstag").getAsString() : null); + //交易识别编码, + log.setNarinn(item.has("narinn") ? item.get("narinn").getAsString() : null); + log.setRpyacc(item.has("rpyacc") ? item.get("rpyacc").getAsString() : null); + log.setRpynam(item.has("rpynam") ? item.get("rpynam").getAsString() : null); + //交易时间 + String trxtim = item.get("trxtim").getAsString(); + //交易日期 + String trxdat = item.has("trxdat") ? item.get("trxdat").getAsString() : ""; + + if(StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0,4)+"-"+trxdat.substring(4,6)+"-"+trxdat.substring(6,8) + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + }else { + trxtim = curDate + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + } + log.setTranTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + //交易金额 + log.setTrxamt(new BigDecimal(item.get("trxamt").getAsString()).multiply(new BigDecimal(100)).longValue()); + //交易方向 D:借方(支出) C:贷方(收入) + String trxdir = item.get("trxdir").getAsString(); + if(trxdir.equals("D")) { + log.setTrxdir((short)2); + }else if (trxdir.equals("C")) { + log.setTrxdir((short)1); + //退款交易:关联原交易 + if(item.get("rlttrx") != null ){ + log.setRefundTrxnbr(item.get("rlttrx").getAsString()); + log.setRefundDate(trxdat); + } + } + log.setBalance(acc.getBalance()); + //记账流水号 + log.setTrxnbr(item.get("trxnbr").getAsString()); + //交易摘要 + if(item.has("trxtxt")) { + log.setTrxtxt(item.get("trxtxt").getAsString()); + } + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs()+","); + } + acc.setTrxnbrs(acc.getTrxnbrs()+"'"+log.getTrxnbr()+"'"); + } + } + } + //不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime() || StringUtils.isNotBlank(acc.getSynPosition())) { + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccountNew(acc); + }else if(StringUtils.isNotBlank(todaySynPosition)){//今天时间还没有过完,需要根据同步位置继续同步 + acc.setSynPosition(todaySynPosition); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 同步招商银行账户 + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + + @Deprecated + public AccountSyn synAccount(AccountSyn acc) { + JsonObject body = new JsonObject(); + String curDate = DateUtils.getDate(); + String synDate = null;//最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + if (StringUtils.isBlank(acc.getSynPosition()) && DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //如果交易日同步完成,则开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate,1); + } + }else { + synDate = curDate; + } + ZhaoShangConfig config = getZhaoShangConfig(acc.getUnitId()); + body.addProperty("bbknbr", config.BBKNBR); + body.addProperty("accnbr", config.ACCNBR); + body.addProperty("trsdat", synDate.replace("-", "")); + if (StringUtils.isNotBlank(acc.getSynPosition())) { + body.addProperty("trsseq", Integer.parseInt(acc.getSynPosition())+1); + } + ZhaoShangResponse res = request(acc.getUnitId(),"DCTRSINF", body,false); + String todaySynPosition = ""; + if (res != null) { + JsonArray rtnBody = null; + if(res.getData().has("ntqactrsz2")) { + rtnBody = res.getData().getAsJsonArray("ntqactrsz2"); + } + if(res.getData().has("ntrbptrsz1")) { + JsonArray ntdmtlsty = res.getData().getAsJsonArray("ntrbptrsz1"); + JsonObject ntdmtlstyItem = ntdmtlsty.get(0).getAsJsonObject(); + todaySynPosition = ntdmtlstyItem.get("trsseq").getAsString(); + if(ntdmtlstyItem.get("cotflg").getAsString().equals("N")) {//已查完交易日的所有交易 + acc.setSynPosition(""); + }else { + acc.setSynPosition(todaySynPosition); + } + }else { + acc.setSynPosition(""); + } + if (rtnBody != null && rtnBody.size() > 0) { + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0, len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + String frmcod = item.has("frmcod") ? item.get("frmcod").getAsString() : ""; + if ((config.ACCNBR + frmcod).equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + //log.setCcynbr(item.getString("ccynbr")); + log.setMthflg(item.has("rsvflg") ? item.get("rsvflg").getAsString() : null); + log.setNarinn(item.has("yurref") ? item.get("yurref").getAsString() : null); + log.setRpyacc(item.has("rpyacc") ? item.get("rpyacc").getAsString() : null); + log.setRpynam(item.has("rpynam") ? item.get("rpynam").getAsString() : null); + String trxtim = item.get("etytim").getAsString(); + String trxdat = item.has("etydat") ? item.get("etydat").getAsString() : ""; + if(StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0,4)+"-"+trxdat.substring(4,6)+"-"+trxdat.substring(6,8) + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + }else { + trxtim = curDate + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + } + log.setTranTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.get("trsamt").getAsString()).multiply(new BigDecimal(100)).longValue()); + String trxdir = item.get("amtcdr").getAsString(); + if(trxdir.equals("D")) { + log.setTrxdir((short)2); + }else if (trxdir.equals("C")) { + log.setTrxdir((short)1); + } + log.setBalance(acc.getBalance()); + log.setTrxnbr(item.get("refnbr").getAsString()); + if(item.has("naryur")) { + log.setTrxtxt(item.get("naryur").getAsString()); + } + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs()+","); + } + acc.setTrxnbrs(acc.getTrxnbrs()+"'"+log.getTrxnbr()+"'"); + } + } + } + //不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime() || StringUtils.isNotBlank(acc.getSynPosition())) { + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + }else if(!"0".equals(todaySynPosition)){//今天时间还没有过完,需要根据同步位置继续同步 + acc.setSynPosition(todaySynPosition); + } + acc.setSynTime(new Date()); + } + return acc; + } + + + /** + * 查询记账子单元信息(只用于提供测试报告) + */ + public void synAccountOld(long unitId,String accnbr,String dmanbr) { + JsonObject body = new JsonObject(); + JsonArray ntdmalstx = new JsonArray(); + JsonObject ntdmalstx1 = new JsonObject(); + ntdmalstx1.addProperty("accnbr", accnbr); + ntdmalstx1.addProperty("dmanbr", dmanbr); + ntdmalstx.add(ntdmalstx1); + body.add("ntdmalstx", ntdmalstx); + request(unitId,"NTDMALST", body,false); + } + + /** + * 关闭记账子单元(只用于提供测试报告) + */ + public void delAccount(long unitId,String accnbr,String dmanbr) { + JsonObject body = new JsonObject(); + JsonObject ntdmaaddx = new JsonObject(); + ntdmaaddx.addProperty("accnbr", accnbr); + ntdmaaddx.addProperty("dmanbr", dmanbr); + ntdmaaddx.addProperty("dmanam", "测试"); + ntdmaaddx.addProperty("ovrctl", "N"); + ntdmaaddx.addProperty("bcktyp", "Y"); + ntdmaaddx.addProperty("clstyp", "N"); + body.add("ntdmaaddx", ntdmaaddx); + request(unitId,"NTDMAADD", body,false); + body = new JsonObject(); + JsonArray ntdmadltx1 = new JsonArray(); + JsonArray ntdmadltx2 = new JsonArray(); + JsonObject ntdmadltx11 = new JsonObject(); + ntdmadltx11.addProperty("accnbr", accnbr); + JsonObject ntdmadltx21 = new JsonObject(); + ntdmadltx21.addProperty("dmanbr", dmanbr); + ntdmadltx1.add(ntdmadltx11); + ntdmadltx2.add(ntdmadltx21); + body.add("ntdmadltx1", ntdmadltx1); + body.add("ntdmadltx2", ntdmadltx2); + request(unitId,"NTDMADLT", body,false); + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject ntdmatrxx1 = new JsonObject(); + ntdmatrxx1.addProperty("accnbr", config.ACCNBR); + ntdmatrxx1.addProperty("dmadbt", log.getSourceCard().substring(config.ACCNBR.length())); + ntdmatrxx1.addProperty("dmacrt", log.getTargetCard().substring(config.ACCNBR.length())); + ntdmatrxx1.addProperty("trxamt", String.format("%.2f", log.getAmount()/100.0)); + ntdmatrxx1.addProperty("trxtxt", log.getRemark()); + body.add("ntdmatrxx1", ntdmatrxx1); + + + + ZhaoShangResponse res = request(log.getUnitId(),"NTDMATRX", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("ntdmatrxz1")) { + ZhaoShangServiceImpl.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntdmatrxz1"); + for (int i = 0,len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + if (item.get("trxdir").getAsString().equals("D")) {//D:付款方 + log.setSourceBankNo(item.get("trxnbr").getAsString()); + }else if (item.get("trxdir").getAsString().equals("C")) {//C:收款方 + log.setTargetBankNo(item.get("trxnbr").getAsString()); + } + } + + JsonArray ntoprrtnz = res.getData().getAsJsonArray("ntoprrtnz"); + + if(ntoprrtnz != null && ntoprrtnz.size() > 0){ + if(!"S".equals(ntoprrtnz.get(0).getAsJsonObject().get("rtnflg").getAsString())){ + throw new ServiceException("内部转账交易失败"); + } + } + + + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("内部转账交易失败"); + } + log.setResult((short)2); + return log; + } + + /*** + * 业务模式 + * @param log + */ + public void dcLismod(TransactionLog log){ + JsonObject body = new JsonObject(); + body.addProperty("buscod","N03020"); + ZhaoShangResponse res = request(log.getUnitId(),"DCLISMOD", body,true,log.getId()); + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log) { +// test(log); + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject ntbusmody = new JsonObject(); + ntbusmody.addProperty("busmod", wConfigService.getItem(log.getUnitId(), "zhaoshang_busmod")); + JsonObject ntagcsaix1 = new JsonObject(); + ntagcsaix1.addProperty("yurref", log.getOrderNo()); + ntagcsaix1.addProperty("bbknbr", wConfigService.getItem(log.getUnitId(), "zhaoshang_bbknbr")); + ntagcsaix1.addProperty("payacc", config.ACCNBR); + ntagcsaix1.addProperty("bustya", "BYBK"); + ntagcsaix1.addProperty("trxrmk", log.getRemark()); + ntagcsaix1.addProperty("begtag", "Y"); + ntagcsaix1.addProperty("endtag", "Y"); + String amount = String.format("%.2f", log.getAmount()/100.0); + ntagcsaix1.addProperty("ttlamt", amount); + ntagcsaix1.addProperty("ttlcnt", "1"); + ntagcsaix1.addProperty("curamt", amount); + ntagcsaix1.addProperty("curcnt", "1"); + ntagcsaix1.addProperty("ttlnum", "1"); + ntagcsaix1.addProperty("jzbnbr", log.getSourceCard().substring(config.ACCNBR.length())); + JsonArray ntagcsaix2 = new JsonArray(); + JsonObject ntagcsaixItem = new JsonObject(); + ntagcsaixItem.addProperty("trxseq", "00000001"); + ntagcsaixItem.addProperty("eacnbr", log.getTargetCard()); + ntagcsaixItem.addProperty("eacnam", log.getTargetAccName()); + ntagcsaixItem.addProperty("rcvamt", amount); + ntagcsaix2.add(ntagcsaixItem); + body.add("ntbusmody", ntbusmody); + body.add("ntagcsaix1", ntagcsaix1); + body.add("ntagcsaix2", ntagcsaix2); + ZhaoShangResponse res = request(log.getUnitId(),"NTAGCAPI", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("ntagcagcz1")) { + throw new ServiceException(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "对私跨行转账失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntagcagcz1"); + log.setSourceBankNo(rtnBody.get(0).getAsJsonObject().get("reqnbr").getAsString()); + log.setTargetBankNo(log.getSourceBankNo()); + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("对私跨行转账申请失败"); + } + log.setResult((short)1); + return log; + } + + + /*** + * 业务模式 + * @param log + */ + public void dcLismod1(TransactionLog log){ + JsonObject body = new JsonObject(); + body.addProperty("buscod","N02030"); + ZhaoShangResponse res = request(log.getUnitId(),"DCLISMOD", body,true,log.getId()); + } + /** + * 对公跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossEnterpriseTransfer(TransactionLog log) { +// dcLismod1(log); + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonArray bb1paybmx1 = new JsonArray(); + JsonObject bb1paybmx1Item = new JsonObject(); + bb1paybmx1Item.addProperty("busCod", "N02030"); + bb1paybmx1Item.addProperty("busMod", wConfigService.getItem(log.getUnitId(), "zhaoshang_busmod_enterprise")); + bb1paybmx1.add(bb1paybmx1Item); + JsonArray bb1payopx1 = new JsonArray(); + JsonObject bb1payopx1Item = new JsonObject(); + bb1payopx1Item.addProperty("ccyNbr", "10"); + bb1payopx1Item.addProperty("crtAcc", log.getTargetCard()); + bb1payopx1Item.addProperty("crtNam", log.getTargetAccName()); + bb1payopx1Item.addProperty("crtBnk", log.getBankType()); + bb1payopx1Item.addProperty("crtAdr", log.getTargetAccBankAddr()); + bb1payopx1Item.addProperty("dmaNbr", log.getSourceCard().substring(config.ACCNBR.length())); + bb1payopx1Item.addProperty("dbtAcc", config.ACCNBR); + bb1payopx1Item.addProperty("nusAge", log.getRemark()); + //测试 +// bb1payopx1Item.addProperty("brdNbr","102100099996"); +// bb1payopx1Item.addProperty("crtAdr","北京市"); + bb1payopx1Item.addProperty("bnkFlg", log.getBankType().contains("招商银行") ? "Y" : "N"); + String amount = String.format("%.2f", log.getAmount()/100.0); + bb1payopx1Item.addProperty("trsAmt", amount); + bb1payopx1Item.addProperty("yurRef", log.getOrderNo()); + bb1payopx1Item.addProperty("busNar", log.getRemark()); + bb1payopx1.add(bb1payopx1Item); + body.add("bb1paybmx1", bb1paybmx1); + body.add("bb1payopx1", bb1payopx1); + ZhaoShangResponse res = request(log.getUnitId(),"BB1PAYOP", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("bb1payopz1")) { + throw new ServiceException(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "对公跨行转账失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("bb1payopz1"); + log.setSourceBankNo(rtnBody.get(0).getAsJsonObject().get("reqNbr").getAsString()); + log.setTargetBankNo(log.getSourceBankNo()); + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("对公跨行转账申请失败"); + } + log.setResult((short)1); + return log; + } + + /** + * 同步对私银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synPersionTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + JsonObject ntagcinyx1 = new JsonObject(); + ntagcinyx1.addProperty("buscod", "N03020"); + ntagcinyx1.addProperty("yurref", log.getOrderNo()); + String endDate = DateUtils.getDate(); + String beginDate = DateUtils.getEndDateByDays(endDate, -3); + ntagcinyx1.addProperty("bgndat", beginDate.replace("-", "")); + ntagcinyx1.addProperty("enddat", endDate.replace("-", "")); + body.add("ntagcinyx1", ntagcinyx1); + ZhaoShangResponse res = request(log.getUnitId(),"NTAGCINY", body,false,log.getId()); + if(res != null) { + if (!res.getResultcode().equals("SUC0000") || !res.getData().has("ntagcinqz")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步对私银行账户交易结果失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntagcinqz"); + JsonObject item = rtnBody.get(0).getAsJsonObject(); + if (item.get("reqsta").getAsString().equals("FIN")) { + String rtnFlg = item.get("rtnflg").getAsString(); + if(rtnFlg.equals("S")) { + body = new JsonObject(); + JsonObject ntagdinfy1 = new JsonObject(); + ntagdinfy1.addProperty("reqnbr", item.get("reqnbr").getAsString()); + body.add("ntagdinfy1", ntagdinfy1); + ZhaoShangResponse ores = request(log.getUnitId(),"NTAGDINF", body,false,log.getId()); + if(ores != null) { + if (!ores.getResultcode().equals("SUC0000") || !ores.getData().has("ntagcdtly1")) { + throw new ServiceException(StringUtils.isNotBlank(ores.getResultmsg()) ? ores.getResultmsg() : "同步对私银行账户交易结果2失败"); + } + JsonArray ortnBody = ores.getData().getAsJsonArray("ntagcdtly1"); + JsonObject oitem = ortnBody.get(0).getAsJsonObject(); + String stscod = oitem.get("stscod").getAsString(); + if (stscod.equals("S")) { + log.setResult((short)2); + }else if(stscod.equals("E")){ + String errdsp = oitem.has("errdsp") ? oitem.get("errdsp").getAsString() : ""; + if (StringUtils.isNotBlank(errdsp)) { + log.setReason(errdsp); + }else{ + log.setReason("银行支付失败[NTAGDINF]"); + } + } + } + }else{ + String errdsp = item.has("errdsp") ? item.get("errdsp").getAsString() : ""; + if (StringUtils.isNotBlank(errdsp)) { + log.setReason(errdsp); + }else if (rtnFlg.equals("F")) { + log.setReason("银行支付失败"); + }else if (rtnFlg.equals("B")) { + log.setReason("支付被退票"); + }else if (rtnFlg.equals("R")) { + log.setReason("审批否决"); + }else if (rtnFlg.equals("D")) { + log.setReason("过期不审批"); + }else if (rtnFlg.equals("C")) { + log.setReason("企业撤销"); + }else if (rtnFlg.equals("M")) { + log.setReason("商户撤销订单"); + }else if (rtnFlg.equals("V")) { + log.setReason("委托贷款被借款方拒绝"); + }else if (rtnFlg.equals("E")) { + log.setReason("已提交到银行"); + }else if (rtnFlg.equals("U")) { + log.setReason("银行挂账"); + } + log.setResult((short)3); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步对公银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synEnterpriseTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + JsonArray bb1payqrx1 = new JsonArray(); + JsonObject bb1payqrx1Item = new JsonObject(); + bb1payqrx1Item.addProperty("busCod", "N02030"); + bb1payqrx1Item.addProperty("yurRef", log.getOrderNo()); + bb1payqrx1.add(bb1payqrx1Item); + body.add("bb1payqrx1", bb1payqrx1); + ZhaoShangResponse res = request(log.getUnitId(),"BB1PAYQR", body,false,log.getId()); + if(res != null) { + if (!res.getResultcode().equals("SUC0000") || !res.getData().has("bb1payqrz1")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步对公银行账户交易结果失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("bb1payqrz1"); + JsonObject item = rtnBody.get(0).getAsJsonObject(); + if (item.get("reqSts").getAsString().equals("FIN")) { + String rtnFlg = item.get("rtnFlg").getAsString(); + if(rtnFlg.equals("S")) { + log.setResult((short)2); + }else{ + String rtnNar = item.has("rtnNar") ? item.get("rtnNar").getAsString() : ""; + if (StringUtils.isNotBlank(rtnNar)) { + log.setReason(rtnNar); + }else if (rtnFlg.equals("F")) { + log.setReason("银行支付失败"); + }else if (rtnFlg.equals("B")) { + log.setReason("支付被退票"); + }else if (rtnFlg.equals("R")) { + log.setReason("审批否决"); + }else if (rtnFlg.equals("D")) { + log.setReason("过期不审批"); + }else if (rtnFlg.equals("C")) { + log.setReason("企业撤销"); + }else if (rtnFlg.equals("U")) { + log.setReason("银行挂账"); + } + log.setResult((short)3); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + */ + public String getTransferCallback(TransactionLog log) { + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject body = new JsonObject(); + body.addProperty("eacnbr", config.ACCNBR); + String endDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + body.addProperty("quedat", endDate); + body.addProperty("trsseq", log.getTargetBankNo()); + ZhaoShangResponse res = request(log.getUnitId(),"DCSIGREC", body,false,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000")) { + if(!res.getResultcode().equals("HOST001")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + } + String callBackFile = ""; + if(res.getData().has("fildat")) { + String fildat = res.getData().get("fildat").getAsString(); + + byte[] bytes = Base64.getDecoder().decode(fildat); + String fileName = log.getTargetBankNo()+"_cb.pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",bytes); +// String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); +// String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId())+"/"; +// +// FileUtils.base64ToFile(fildat, fileName, uploadPhyPath); +// callBackFile = uploadNetPath + fileName; + callBackFile = remoteFile.getUrl(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log,String trsseq) { + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject body = new JsonObject(); + body.addProperty("bbknbr", wConfigService.getItem(log.getUnitId(), "zhaoshang_bbknbr")); + String endDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + body.addProperty("trsdat", endDate.replace("-", "")); + body.addProperty("accnbr", config.ACCNBR); + body.addProperty("trsseq", trsseq); + ZhaoShangResponse res = request(log.getUnitId(),"DCTRSINF", body,false,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + String result = ""; + if(res.getData().has("ntrbptrsz1")) { + JsonArray ntrbptrsz1 = res.getData().getAsJsonArray("ntrbptrsz1"); + JsonObject ntrbptrsz1Item = ntrbptrsz1.get(0).getAsJsonObject(); + if(res.getData().has("ntqactrsz2")) { + JsonArray rtnBody = res.getData().getAsJsonArray("ntqactrsz2"); + for (int i = 0,len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + if (item.get("yurref").getAsString().equals(log.getOrderNo())) { + result = item.get("refnbr").getAsString(); + break; + } + } + } + if(StringUtils.isBlank(result) && ntrbptrsz1Item.get("cotflg").getAsString().equals("Y")) { + return getTransferBankNo(log,(Long.parseLong(ntrbptrsz1Item.get("trsseq").getAsString()) + 1)+""); + } + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java new file mode 100644 index 0000000..7927efe --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java @@ -0,0 +1,622 @@ +package org.dromara.settlement.service.impl; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Date; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.FileUtils; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoConfig; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoResponse; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoUtil; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SignZhifubaoMapper; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import org.dromara.settlement.api.RemoteConfigService; +import com.alipay.api.AlipayRequest; +import com.alipay.api.request.AlipayDataBillAccountbookereceiptQueryRequest; +import com.alipay.api.request.AlipayDataBillEreceiptagentApplyRequest; +import com.alipay.api.request.AlipayFundAccountbookCreateRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifyQueryRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifySubscribeRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifyUnsubscribeRequest; +import com.alipay.api.request.AlipayFundTransCommonQueryRequest; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.request.AlipayUserAgreementPageSignRequest; +import com.alipay.api.request.AlipayUserAgreementQueryRequest; +import com.alipay.api.request.AlipayUserAgreementUnsignRequest; +import com.alipay.api.request.AlipayUserCertdocCertverifyConsultRequest; +import com.alipay.api.request.AlipayUserCertdocCertverifyPreconsultRequest; +import com.alipay.api.response.AlipayDataBillAccountbookereceiptQueryResponse; +import com.alipay.api.response.AlipayDataBillEreceiptagentApplyResponse; +import com.alipay.api.response.AlipayFundAccountbookCreateResponse; +import com.alipay.api.response.AlipayFundAccountbookNotifyQueryResponse; +import com.alipay.api.response.AlipayFundTransCommonQueryResponse; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import com.alipay.api.response.AlipayUserAgreementPageSignResponse; +import com.alipay.api.response.AlipayUserAgreementQueryResponse; +import com.alipay.api.response.AlipayUserCertdocCertverifyConsultResponse; +import com.alipay.api.response.AlipayUserCertdocCertverifyPreconsultResponse; +import com.jcraft.jsch.SftpException; + + +@Service +public class ZhiFuBaoServiceImpl { + private Logger log = LoggerFactory.getLogger(ZhiFuBaoServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;// 交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + @Autowired + private SignZhifubaoMapper signZhifubaoDao;// 支付宝签约信息 + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record) { + return request(unitId, request, record, null, false); + } + + private ZhiFuBaoResponse requestPage(long unitId, AlipayRequest request, boolean record) { + return request(unitId, request, record, null, true); + } + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record, Long tranId) { + return request(unitId, request, record, tranId, false); + } + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record, Long tranId, boolean isPage) { + ZhiFuBaoResponse response = null; + ZhiFuBaoConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = ZhiFuBaoUtil.getInstance().request(config, request, isPage); + if (requsetRtn != null) { + response = requsetRtn.getRtnData(); + if (record) { + sysLog.setRequest(requsetRtn.getResult()); + sysLog.setResponseTime(new Date()); + if (requsetRtn.getRtnData() != null) { + sysLog.setResponse(JSONObject.toJSONString(requsetRtn.getRtnData())); + } + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + public ZhiFuBaoConfig getBankConfig(long unitId) { + ZhiFuBaoConfig config = new ZhiFuBaoConfig(); + if (wConfigService != null && unitId > 0) { + config.URL = wConfigService.getItem(unitId, "zhifubao_bank_api"); + //config.URL = config.URL.replace("test://", "https://");//测试时使用 + config.APPID = wConfigService.getItem(unitId, "zhifubao_bank_appid"); + config.accName = wConfigService.getItem(unitId, "zhifubao_acc_name"); + config.prikeyStr = wConfigService.getItem(unitId, "zhifubao_bank_prikey"); + String uploadPhyPath = wConfigService.getUploadPhyPath(unitId) + "/"; + config.alipayCertPublicKey = uploadPhyPath + + wConfigService.getItem(unitId, "zhifubao_bank_alipayCertPublicKey"); + config.alipayRootCert = uploadPhyPath + wConfigService.getItem(unitId, "zhifubao_bank_alipayRootCert"); + config.appCertPublicKey = uploadPhyPath + wConfigService.getItem(unitId, "zhifubao_bank_appCertPublicKey"); + config.notifyUrl = wConfigService.getItem(unitId, "zhifubao_bank_notifyUrl"); + if (StringUtils.isBlank(config.APPID)) { + String key = "config:" + unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.APPID); + } + return config; + } + + /** + * 解约支付宝协议 + * + * @author 张涛 + * @date 2022年8月29日 + * @param unitId 结算单位id + * @return + */ + public void cancelAgreement(long unitId) { + AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest(); + request.setBizContent("{" + " \"personal_product_code\":\"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\":\"INDUSTRY|SATF_ACC\"," + " \"external_agreement_no\":\"" + unitId + "\"," + + " \"third_party_type\":\"PARTNER\"" + "}"); + request(unitId, request, false); + } + + /** + * 获取支付宝协议二维码 + * + * @author 张涛 + * @date 2022年8月29日 + * @param unitId 结算单位id + * @return + */ + public SignZhifubao getAgreementQrcode(long unitId, String unitName) { + ZhiFuBaoConfig config = getBankConfig(unitId); + if (StringUtils.isBlank(config.APPID)) { + return new SignZhifubao(); + } + AlipayUserAgreementQueryRequest queryReq = new AlipayUserAgreementQueryRequest(); + queryReq.setBizContent("{" + + " \"personal_product_code\": \"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\": \"INDUSTRY|SATF_ACC\"," + + " \"product_code\": \"FUND_SAFT_SIGN_WITHHOLDING\"," + + " \"external_agreement_no\": \""+unitId+"\"," + + " \"third_party_type\": \"PARTNER\"" + + "}");//设置业务参数 + ZhiFuBaoResponse queryRes = request(unitId, queryReq, false); + if (queryRes == null) { + throw new ServiceException("请检查结算中心的配置是否正确"); + } + SignZhifubao result = new SignZhifubao(); + if (queryRes.getResultcode().equals("10000")) { + AlipayUserAgreementQueryResponse queryResObj = (AlipayUserAgreementQueryResponse)queryRes.getData(); + result.setAppId(config.APPID); + result.setAgreementNo(queryResObj.getAgreementNo()); + result.setAlipayLogonId(queryResObj.getAlipayLogonId()); + result.setSignTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, queryResObj.getSignTime())); + result.setStatus(queryResObj.getStatus()); + result.setValidTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, queryResObj.getValidTime())); + } + AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest(); + request.setNotifyUrl(config.notifyUrl + "public/signAgr"); + request.setBizContent("{" + " \"external_logon_id\": \"" + unitName + "\"," + + " \"personal_product_code\": \"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\": \"INDUSTRY|SATF_ACC\"," + " \"external_agreement_no\": \"" + unitId + "\"," + + " \"third_party_type\": \"PARTNER\"," + " \"product_code\": \"FUND_SAFT_SIGN_WITHHOLDING\"," + + " \"access_params\": {" + " \"channel\": \"QRCODE\"" + " }" + "}");// 设置业务参数 + ZhiFuBaoResponse res = requestPage(unitId, request, false); + if (res != null) { + AlipayUserAgreementPageSignResponse response = (AlipayUserAgreementPageSignResponse) res.getData(); + System.out.println(response.getBody()); + result.setSignUrl(response.getBody()); + } + return result; + } + + /** + * 创建支付宝记账本 + * + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 记账本编号 + * @param name 记账本名称 + * @param prefix 记账本编号前缀 + */ + public Account createAccount(long unitId, String code, String name, String prefix) { + ZhiFuBaoConfig config = getBankConfig(unitId); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + int total = 10; + if (StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0" + code; + } + if (StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + AlipayFundAccountbookCreateRequest request = new AlipayFundAccountbookCreateRequest(); + request.setBizContent(" {" + " \"merchant_user_id\":\"" + code + "\"," + + " \"merchant_user_type\":\"BUSINESS_ORGANIZATION\"," + " \"scene_code\":\"SATF_FUND_BOOK\"," + + " \"ext_info\":\"{\\\"agreement_no\\\":\\\"" + sign.getAgreementNo() + "\\\",\\\"userId\\\":\\\"" + + code + "\\\",\\\"userName\\\":\\\"" + name + "\\\",\\\"userType\\\":\\\"" + prefix + + "\\\",\\\"unitId\\\":\\\"" + unitId + "\\\"}\"" + " }"); + ZhiFuBaoResponse res = request(unitId, request, false); + if (res != null && res.getResultcode().equals("10000")) { + AlipayFundAccountbookCreateResponse book = (AlipayFundAccountbookCreateResponse) res.getData(); + String subscribeBiz = "{" + " \"product_code\":\"SATF_FUND_BOOK\"," + " \"biz_scene\":\"DEFAULT\"," + + " \"account_book_id\":\"" + book.getAccountBookId() + "\"," + " \"agreement_no\":\"" + + sign.getAgreementNo() + "\"" + "}"; + AlipayFundAccountbookNotifyQueryRequest subSearch = new AlipayFundAccountbookNotifyQueryRequest(); + subSearch.setBizContent(subscribeBiz); + ZhiFuBaoResponse subRes = request(unitId, subSearch, false); + if (subRes != null) { + boolean subSuccess = true;// 是否订阅成功 + AlipayFundAccountbookNotifyQueryResponse subSearchRes = (AlipayFundAccountbookNotifyQueryResponse) subRes + .getData(); + if ("SUBSCRIPTION_RELATION_NOT_EXIST".equals(subSearchRes.getSubCode()) || "ACCOUNT_BOOK_INFO_QUERY_FAIL".equals(subSearchRes.getSubCode()) + || (StringUtils.isNotBlank(subSearchRes.getSubscribeStatus()) && subSearchRes.getSubscribeStatus().equals("INVALID"))) { + if (StringUtils.isNotBlank(subSearchRes.getSubscribeStatus()) && subSearchRes.getSubscribeStatus().equals("INVALID")) { + AlipayFundAccountbookNotifyUnsubscribeRequest unsubReq = new AlipayFundAccountbookNotifyUnsubscribeRequest(); + unsubReq.setBizContent(subscribeBiz); + request(unitId, unsubReq, false); + } + AlipayFundAccountbookNotifySubscribeRequest subReq = new AlipayFundAccountbookNotifySubscribeRequest(); + subReq.setBizContent(subscribeBiz); + subRes = request(unitId, subReq, false); + if (subRes == null || !subRes.getResultcode().equals("10000")) { + subSuccess = false; + } + } + if (subSuccess) { + Account account = new Account(); + account.setBankType("支付宝"); + account.setBankTypeName("支付宝"); + account.setBankCard(book.getExtCardInfo().getCardNo()); + account.setBankArgNo(book.getAccountBookId()); + account.setBankAddress(book.getExtCardInfo().getCardLocation()); + account.setBalance(0l); + return account; + } + } + } + return null; + } + + /** + * 记账本内部转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + log.setResult((short)3);//失败 + log.setReason("未签约协议"); + return log; + } + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + String amt = String.format("%.2f", log.getAmount() / 100.0); + request.setBizContent("{" + + "\"out_biz_no\":\""+log.getOrderNo()+"\"," + + "\"trans_amount\":"+amt+"," + + "\"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + + "\"biz_scene\":\"ENTRUST_ALLOCATION\"," + + "\"order_title\":\""+log.getRemark()+"\"," + + "\"payee_info\":{" + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + "\"identity\":\""+log.getTargetCard()+"\"," + + "\"name\":\""+log.getTargetAccName()+"\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }," + + "\"payer_info\":{" + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + "\"identity\":\""+log.getSourceCard()+"\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }," + + "\"remark\":\""+log.getRemark()+"\"," + + "\"business_params\":\"{\\\"payer_show_name_use_alias\\\":\\\"true\\\"}\"," + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, true, log.getId()); + AlipayFundTransUniTransferResponse tranRes = null; + if(res.getData() != null) { + tranRes = (AlipayFundTransUniTransferResponse)res.getData(); + } + if (res == null || !res.getResultcode().equals("10000")) { + String msg = "内部转账失败"; + if (tranRes != null) { + if (StringUtils.isNotBlank(tranRes.getSubMsg())) { + msg = tranRes.getSubMsg(); + }else if (StringUtils.isNotBlank(tranRes.getMsg())) { + msg = tranRes.getMsg(); + } + }else if (StringUtils.isNotBlank(res.getResultmsg())) { + msg = res.getResultmsg(); + } + this.log.error(msg); + log.setResult((short) -1); + return log; + } + log.setSourceBankNo(tranRes.getOrderId()); + log.setTargetBankNo(tranRes.getPayFundOrderId()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog transfer(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + log.setResult((short)3);//失败 + log.setReason("未签约协议"); + return log; + } + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + String amt = String.format("%.2f", log.getAmount() / 100.0); + request.setBizContent("{" + + "\"out_biz_no\":\""+log.getOrderNo()+"\"," + + "\"trans_amount\":"+amt+"," + + "\"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + + "\"biz_scene\":\"ENTRUST_TRANSFER\"," + + "\"order_title\":\""+log.getRemark()+"\"," + + "\"payee_info\":{" + + "\"identity\":\""+log.getTargetCard()+"\"," + + "\"identity_type\":\"ALIPAY_LOGON_ID\"," + + "\"name\":\""+log.getTargetAccName()+"\"" + + " }," + + "\"remark\":\""+log.getRemark()+"\"," + + "\"business_params\":\"{\\\"payer_show_name_use_alias\\\":\\\"true\\\"}\"," + + "\"payer_info\":{" + + "\"identity\":\""+log.getSourceCard()+"\"," + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, true, log.getId()); + AlipayFundTransUniTransferResponse tranRes = null; + if(res.getData() != null) { + tranRes = (AlipayFundTransUniTransferResponse)res.getData(); + } + if (res == null || !res.getResultcode().equals("10000")) { + String msg = "转账失败"; + if (tranRes != null) { + if (StringUtils.isNotBlank(tranRes.getSubMsg())) { + msg = tranRes.getSubMsg(); + }else if (StringUtils.isNotBlank(tranRes.getMsg())) { + msg = tranRes.getMsg(); + } + }else if (StringUtils.isNotBlank(res.getResultmsg())) { + msg = res.getResultmsg(); + } + throw new ServiceException(msg); + } + log.setSourceBankNo(tranRes.getOrderId()); + log.setTargetBankNo(tranRes.getPayFundOrderId()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + request.setProdCode("SINGLE_TRANSFER_NO_PWD"); + request.setBizContent("{" + " \"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + " \"biz_scene\":\"ENTRUST_ALLOCATION\"," + + " \"out_biz_no\":\"" + log.getOrderNo() + "\"}"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("10000")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() + : "同步支付宝对私交易结果失败"); + } + AlipayFundTransCommonQueryResponse queryRes = (AlipayFundTransCommonQueryResponse)res.getData(); + if (queryRes.getStatus().equals("SUCCESS")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (!queryRes.getStatus().equals("WAIT_PAY")) { + log.setResult((short) 3); + log.setReason(queryRes.getFailReason()); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + request.setProdCode("SINGLE_TRANSFER_NO_PWD"); + request.setBizContent("{" + " \"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + " \"biz_scene\":\"ENTRUST_TRANSFER\"," + + " \"out_biz_no\":\"" + log.getOrderNo() + "\"}"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("10000")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() + : "同步支付宝交易结果失败"); + } + AlipayFundTransCommonQueryResponse queryRes = (AlipayFundTransCommonQueryResponse)res.getData(); + if (queryRes.getStatus().equals("SUCCESS")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (!queryRes.getStatus().equals("WAIT_PAY")) { + log.setResult((short) 3); + log.setReason(queryRes.getFailReason()); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + + public String getTransferCallback(TransactionLog log) throws IOException { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + AlipayDataBillAccountbookereceiptQueryRequest queryReq = new AlipayDataBillAccountbookereceiptQueryRequest(); + queryReq.setBizContent("{" + + "\"file_id\":\""+log.getPayReceiptId()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + String callBackFile = ""; + ZhiFuBaoResponse res = request(log.getUnitId(),queryReq,false,log.getId()); + if (res != null && res.getResultcode().equals("10000")) { + AlipayDataBillAccountbookereceiptQueryResponse queryRes = (AlipayDataBillAccountbookereceiptQueryResponse)res.getData(); + if(queryRes.getStatus().equals("SUCCESS")) { + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId()) + "/"; + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + String fileName = log.getOrderNo()+".pdf"; + FileUtils.copyURLToFile(new URL(queryRes.getDownloadUrl()), new File(uploadPhyPath, fileName)); + callBackFile = (uploadPhyPath+fileName).replace(uploadPhyPath, uploadNetPath); + } + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + String result = ""; + boolean isApply = true;//是否需要申请回单 + if(StringUtils.isNotBlank(log.getPayReceiptId())) { + isApply = false; + AlipayDataBillAccountbookereceiptQueryRequest queryReq = new AlipayDataBillAccountbookereceiptQueryRequest(); + queryReq.setBizContent("{" + + "\"file_id\":\""+log.getPayReceiptId()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(),queryReq,false,log.getId()); + if (res != null) { + if(res.getResultcode().equals("10000")) { + AlipayDataBillAccountbookereceiptQueryResponse queryRes = (AlipayDataBillAccountbookereceiptQueryResponse)res.getData(); + if(queryRes.getStatus().equals("SUCCESS")) { + result = log.getTargetBankNo(); + }else if (queryRes.getStatus().equals("FAIL")) { + isApply = true; + } + }else if (res.getData() != null && StringUtils.isNotBlank(res.getData().getSubMsg()) && res.getData().getSubMsg().indexOf("业务异常申请记录不存在") > -1) { + isApply = true; + } + if (isApply) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(""); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + } + if(isApply) { + AlipayDataBillEreceiptagentApplyRequest request = new AlipayDataBillEreceiptagentApplyRequest(); + request.setBizContent("{" + + "\"type\":\"FUND_DETAIL\"," + + "\"key\":\""+log.getTargetBankNo()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(),request,false,log.getId()); + if (res == null || !res.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + + AlipayDataBillEreceiptagentApplyResponse applyRes = (AlipayDataBillEreceiptagentApplyResponse)res.getData(); + if(StringUtils.isNotBlank(applyRes.getFileId())) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(applyRes.getFileId()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + return result; + } + + public boolean valiAccount(String bankCard, String mobile, String name, + String cardId) { + SignZhifubao sign = signZhifubaoDao.selectValid(); + if (sign == null) { + throw new ServiceException("支付宝账户认证失败【错误代码:1】"); + } + AlipayUserCertdocCertverifyPreconsultRequest request = new AlipayUserCertdocCertverifyPreconsultRequest(); + StringBuffer bizContentStr = new StringBuffer("{"); + bizContentStr.append(" \"user_name\":\""+name+"\","); + bizContentStr.append(" \"cert_type\":\"IDENTITY_CARD\","); + bizContentStr.append(" \"cert_no\":\""+cardId+"\","); + if(StringUtils.isNotBlank(mobile)) { + bizContentStr.append(" \"mobile\":\""+mobile+"\","); + } + bizContentStr.append(" \"logon_id\":\""+bankCard+"\""); + bizContentStr.append("}"); + request.setBizContent(bizContentStr.toString()); + ZhiFuBaoResponse res = request(sign.getUnitId(),request,false); + if (res == null || !res.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "支付宝账户认证失败【错误代码:2】"); + } + AlipayUserCertdocCertverifyPreconsultResponse verifyRes = (AlipayUserCertdocCertverifyPreconsultResponse)res.getData(); + if (StringUtils.isBlank(verifyRes.getVerifyId())) { + throw new ServiceException("支付宝账户认证失败【错误代码:3】"); + } + AlipayUserCertdocCertverifyConsultRequest consultRequest = new AlipayUserCertdocCertverifyConsultRequest(); + consultRequest.setBizContent("{" + + " \"verify_id\":\""+verifyRes.getVerifyId()+"\"" + + "}"); + ZhiFuBaoResponse consultRes = request(sign.getUnitId(),consultRequest,false); + if (consultRes == null || !consultRes.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(consultRes.getResultmsg()) ? consultRes.getResultmsg() : "支付宝账户认证失败【错误代码:4】"); + } + AlipayUserCertdocCertverifyConsultResponse response = (AlipayUserCertdocCertverifyConsultResponse)consultRes.getData(); + if (!"T".equals(response.getPassed())) { + throw new ServiceException(StringUtils.isNotBlank(response.getFailReason()) ? response.getFailReason() : "支付宝账户认证失败【错误代码:5】"); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml b/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml new file mode 100644 index 0000000..8758f15 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9206 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-settlement + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml new file mode 100644 index 0000000..5dc1463 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, unit_id, acc_id, bank_type, bank_card, trxdir, trxamt, balance, add_time, add_by, + narinn, trxnbr, ccynbr, tran_time, rpyacc, rpynam, trxtxt, mthflg + + + + + + + + + + + delete from acc_account_log + where id = #{id,jdbcType=BIGINT} + + + + insert into acc_account_log (unit_id, acc_id, + bank_type, bank_card, trxdir, + trxamt, balance, add_time, + add_by, narinn, trxnbr, + ccynbr, tran_time, rpyacc, + rpynam, trxtxt, mthflg) + + select #{item.unitId,jdbcType=BIGINT}, #{item.accId,jdbcType=INTEGER}, + #{item.bankType,jdbcType=VARCHAR}, #{item.bankCard,jdbcType=VARCHAR}, #{item.trxdir,jdbcType=SMALLINT}, + #{item.trxamt,jdbcType=BIGINT}, #{item.balance,jdbcType=BIGINT}, #{item.addTime,jdbcType=TIMESTAMP}, + #{item.addBy,jdbcType=VARCHAR}, #{item.narinn,jdbcType=VARCHAR}, #{item.trxnbr,jdbcType=VARCHAR}, + #{item.ccynbr,jdbcType=VARCHAR}, #{item.tranTime,jdbcType=TIMESTAMP}, #{item.rpyacc,jdbcType=VARCHAR}, + #{item.rpynam,jdbcType=VARCHAR}, #{item.trxtxt,jdbcType=VARCHAR}, #{item.mthflg,jdbcType=VARCHAR} + + + + + insert into acc_account_log (id, unit_id, acc_id, + bank_type, bank_card, trxdir, + trxamt, balance, add_time, + add_by, narinn, trxnbr, + ccynbr, tran_time, rpyacc, + rpynam, trxtxt, mthflg + ) + values (#{id,jdbcType=BIGINT}, #{unitId,jdbcType=BIGINT}, #{accId,jdbcType=INTEGER}, + #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}, #{trxdir,jdbcType=SMALLINT}, + #{trxamt,jdbcType=BIGINT}, #{balance,jdbcType=BIGINT}, #{addTime,jdbcType=TIMESTAMP}, + #{addBy,jdbcType=VARCHAR}, #{narinn,jdbcType=VARCHAR}, #{trxnbr,jdbcType=VARCHAR}, + #{ccynbr,jdbcType=VARCHAR}, #{tranTime,jdbcType=TIMESTAMP}, #{rpyacc,jdbcType=VARCHAR}, + #{rpynam,jdbcType=VARCHAR}, #{trxtxt,jdbcType=VARCHAR}, #{mthflg,jdbcType=VARCHAR} + ) + + + insert into acc_account_log + + + id, + + + unit_id, + + + acc_id, + + + bank_type, + + + bank_card, + + + trxdir, + + + trxamt, + + + balance, + + + add_time, + + + add_by, + + + narinn, + + + trxnbr, + + + ccynbr, + + + tran_time, + + + rpyacc, + + + rpynam, + + + trxtxt, + + + mthflg, + + + + + #{id,jdbcType=BIGINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{trxdir,jdbcType=SMALLINT}, + + + #{trxamt,jdbcType=BIGINT}, + + + #{balance,jdbcType=BIGINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{narinn,jdbcType=VARCHAR}, + + + #{trxnbr,jdbcType=VARCHAR}, + + + #{ccynbr,jdbcType=VARCHAR}, + + + #{tranTime,jdbcType=TIMESTAMP}, + + + #{rpyacc,jdbcType=VARCHAR}, + + + #{rpynam,jdbcType=VARCHAR}, + + + #{trxtxt,jdbcType=VARCHAR}, + + + #{mthflg,jdbcType=VARCHAR}, + + + + + update acc_account_log + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + acc_id = #{accId,jdbcType=INTEGER}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + trxdir = #{trxdir,jdbcType=SMALLINT}, + + + trxamt = #{trxamt,jdbcType=BIGINT}, + + + balance = #{balance,jdbcType=BIGINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + add_by = #{addBy,jdbcType=VARCHAR}, + + + narinn = #{narinn,jdbcType=VARCHAR}, + + + trxnbr = #{trxnbr,jdbcType=VARCHAR}, + + + ccynbr = #{ccynbr,jdbcType=VARCHAR}, + + + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + + + rpyacc = #{rpyacc,jdbcType=VARCHAR}, + + + rpynam = #{rpynam,jdbcType=VARCHAR}, + + + trxtxt = #{trxtxt,jdbcType=VARCHAR}, + + + mthflg = #{mthflg,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update acc_account_log + set unit_id = #{unitId,jdbcType=BIGINT}, + acc_id = #{accId,jdbcType=INTEGER}, + bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR}, + trxdir = #{trxdir,jdbcType=SMALLINT}, + trxamt = #{trxamt,jdbcType=BIGINT}, + balance = #{balance,jdbcType=BIGINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + add_by = #{addBy,jdbcType=VARCHAR}, + narinn = #{narinn,jdbcType=VARCHAR}, + trxnbr = #{trxnbr,jdbcType=VARCHAR}, + ccynbr = #{ccynbr,jdbcType=VARCHAR}, + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + rpyacc = #{rpyacc,jdbcType=VARCHAR}, + rpynam = #{rpynam,jdbcType=VARCHAR}, + trxtxt = #{trxtxt,jdbcType=VARCHAR}, + mthflg = #{mthflg,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml new file mode 100644 index 0000000..a2511e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + id, bank_type, bank_card, balance, status, add_time, edit_time, unit_id, type, name, bank_address, bank_arg_no, + bank_no + + + + + + + + + delete from acc_account + where id = #{id,jdbcType=INTEGER} + + + insert into acc_account (id, bank_type, bank_card, + balance, status, add_time, + edit_time) + values (#{id,jdbcType=INTEGER}, #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}, + #{balance,jdbcType=DECIMAL}, #{status,jdbcType=SMALLINT}, #{addTime,jdbcType=TIMESTAMP}, + #{editTime,jdbcType=TIMESTAMP}) + + + insert into acc_account + + + id, + + + bank_type, + + + name, + + + bank_card, + + + balance, + + + status, + + + add_time, + + + edit_time, + + + type, + + + unit_id, + + + bank_address, + + + bank_arg_no, + + + bank_no, + + + bank_name, + + + + + #{id,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=DECIMAL}, + + + #{status,jdbcType=SMALLINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{editTime,jdbcType=TIMESTAMP}, + + + #{type,jdbcType=SMALLINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{bankAddress,jdbcType=VARCHAR}, + + + #{bankArgNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{bankName,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + acc_account t + WHERE + t.bank_type = #{bankType,jdbcType=VARCHAR} + AND t.bank_card = #{bankCard,jdbcType=VARCHAR}) + + + update acc_account + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + balance = #{balance,jdbcType=DECIMAL}, + + + status = #{status,jdbcType=SMALLINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + bank_address = #{bankAddress,jdbcType=VARCHAR}, + + + name = #{name,jdbcType=VARCHAR}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + bank_no = #{bankNo,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + update acc_account + set bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR}, + balance = #{balance,jdbcType=DECIMAL}, + status = #{status,jdbcType=SMALLINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + edit_time = #{editTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + UPDATE acc_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml new file mode 100644 index 0000000..27ab46a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + id, unit_id, syn_lock, syn_time, syn_position, type, bank_type, bank_card + + + + delete from acc_account_syn + where id = #{id,jdbcType=INTEGER} + + + insert into acc_account_syn (id, unit_id, syn_lock, + syn_time, syn_position, type, + bank_type, bank_card) + values (#{id,jdbcType=INTEGER}, #{unitId,jdbcType=BIGINT}, #{synLock,jdbcType=TINYINT}, + #{synTime,jdbcType=TIMESTAMP}, #{synPosition,jdbcType=VARCHAR}, #{type,jdbcType=SMALLINT}, + #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}) + + + insert into acc_account_syn + + + id, + + + unit_id, + + + syn_lock, + + + syn_time, + + + syn_position, + + + type, + + + bank_type, + + + bank_card, + + + + + #{id,jdbcType=INTEGER}, + + + #{unitId,jdbcType=BIGINT}, + + + #{synLock,jdbcType=TINYINT}, + + + #{synTime,jdbcType=TIMESTAMP}, + + + #{synPosition,jdbcType=VARCHAR}, + + + #{type,jdbcType=SMALLINT}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + acc_account_syn t + WHERE + t.id = #{id,jdbcType=INTEGER}) + + + update acc_account_syn + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + syn_lock = #{synLock,jdbcType=TINYINT}, + + + syn_time = #{synTime,jdbcType=TIMESTAMP}, + + + syn_position = #{synPosition,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=SMALLINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + update acc_account_syn + set unit_id = #{unitId,jdbcType=BIGINT}, + syn_lock = #{synLock,jdbcType=TINYINT}, + syn_time = #{synTime,jdbcType=TIMESTAMP}, + syn_position = #{synPosition,jdbcType=VARCHAR}, + type = #{type,jdbcType=SMALLINT}, + bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR} + where id = #{id,jdbcType=INTEGER} + + + + UPDATE acc_account_syn + SET syn_lock = 1 + WHERE + syn_lock = 0 + AND id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml new file mode 100644 index 0000000..2621b2c --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + id, unit_id, app_id, agreement_no, alipay_logon_id, valid_time, sign_time, status, + add_time + + + + + + + + + delete from sign_zhifubao + where id = #{id,jdbcType=INTEGER} + + + insert into sign_zhifubao (id, unit_id, app_id, + agreement_no, alipay_logon_id, valid_time, + sign_time, status, add_time + ) + values (#{id,jdbcType=INTEGER}, #{unitId,jdbcType=BIGINT}, #{appId,jdbcType=VARCHAR}, + #{agreementNo,jdbcType=VARCHAR}, #{alipayLogonId,jdbcType=VARCHAR}, #{validTime,jdbcType=TIMESTAMP}, + #{signTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{addTime,jdbcType=TIMESTAMP} + ) + + + insert into sign_zhifubao + + + id, + + + unit_id, + + + app_id, + + + agreement_no, + + + alipay_logon_id, + + + valid_time, + + + sign_time, + + + status, + + + add_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{unitId,jdbcType=BIGINT}, + + + #{appId,jdbcType=VARCHAR}, + + + #{agreementNo,jdbcType=VARCHAR}, + + + #{alipayLogonId,jdbcType=VARCHAR}, + + + #{validTime,jdbcType=TIMESTAMP}, + + + #{signTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=VARCHAR}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + sign_zhifubao t + WHERE + t.unit_id = #{unitId,jdbcType=BIGINT} + AND t.app_id = #{appId,jdbcType=VARCHAR}) + + + update sign_zhifubao + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + app_id = #{appId,jdbcType=VARCHAR}, + + + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + + + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + + + valid_time = #{validTime,jdbcType=TIMESTAMP}, + + + sign_time = #{signTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=INTEGER} + + + + update sign_zhifubao + set unit_id = #{unitId,jdbcType=BIGINT}, + app_id = #{appId,jdbcType=VARCHAR}, + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + valid_time = #{validTime,jdbcType=TIMESTAMP}, + sign_time = #{signTime,jdbcType=TIMESTAMP}, + status = #{status,jdbcType=VARCHAR}, + add_time = #{addTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + update sign_zhifubao + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + + + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + + + valid_time = #{validTime,jdbcType=TIMESTAMP}, + + + sign_time = #{signTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + where app_id = #{appId,jdbcType=VARCHAR} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml new file mode 100644 index 0000000..5269371 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + id, reqid, request, response, request_time, response_time, tran_id + + + + + delete from sys_log + where tran_id = #{tranId,jdbcType=BIGINT} + + AND id != #{id,jdbcType=BIGINT} + + + + + delete from sys_log + where id = #{id,jdbcType=BIGINT} + + + insert into sys_log (reqid, request, + response, request_time, response_time, + tran_id) + values (#{reqid,jdbcType=VARCHAR}, #{request,jdbcType=VARCHAR}, + #{response,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, + #{tranId,jdbcType=BIGINT}) + + + insert into sys_log + + + id, + + + reqid, + + + request, + + + response, + + + request_time, + + + response_time, + + + tran_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{reqid,jdbcType=VARCHAR}, + + + #{request,jdbcType=VARCHAR}, + + + #{response,jdbcType=VARCHAR}, + + + #{requestTime,jdbcType=TIMESTAMP}, + + + #{responseTime,jdbcType=TIMESTAMP}, + + + #{tranId,jdbcType=BIGINT}, + + + + + update sys_log + + + reqid = #{reqid,jdbcType=VARCHAR}, + + + request = #{request,jdbcType=VARCHAR}, + + + response = #{response,jdbcType=VARCHAR}, + + + request_time = #{requestTime,jdbcType=TIMESTAMP}, + + + response_time = #{responseTime,jdbcType=TIMESTAMP}, + + + tran_id = #{tranId,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_log + set reqid = #{reqid,jdbcType=VARCHAR}, + request = #{request,jdbcType=VARCHAR}, + response = #{response,jdbcType=VARCHAR}, + request_time = #{requestTime,jdbcType=TIMESTAMP}, + response_time = #{responseTime,jdbcType=TIMESTAMP}, + tran_id = #{tranId,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml new file mode 100644 index 0000000..65f2086 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + conf_item, conf_unit, conf_unit_type, conf_value, conf_group, conf_group_sort, conf_group_name, + conf_sort, conf_remark, conf_is_editor, update_time, update_by, class_name, class_alias, + is_enable, class_sort + + + + + + + delete from sys_unit_config + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + insert into sys_unit_config (conf_item, conf_unit, conf_unit_type, + conf_value, conf_group, conf_group_sort, + conf_group_name, conf_sort, conf_remark, + conf_is_editor, update_time, update_by, + class_name, class_alias, is_enable, + class_sort) + values (#{confItem,jdbcType=VARCHAR}, #{confUnit,jdbcType=BIGINT}, #{confUnitType,jdbcType=INTEGER}, + #{confValue,jdbcType=VARCHAR}, #{confGroup,jdbcType=VARCHAR}, #{confGroupSort,jdbcType=INTEGER}, + #{confGroupName,jdbcType=VARCHAR}, #{confSort,jdbcType=INTEGER}, #{confRemark,jdbcType=VARCHAR}, + #{confIsEditor,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}, + #{className,jdbcType=VARCHAR}, #{classAlias,jdbcType=VARCHAR}, #{isEnable,jdbcType=INTEGER}, + #{classSort,jdbcType=INTEGER}) + + + insert into sys_unit_config + + + conf_item, + + + conf_unit, + + + conf_unit_type, + + + conf_value, + + + conf_group, + + + conf_group_sort, + + + conf_group_name, + + + conf_sort, + + + conf_remark, + + + conf_is_editor, + + + update_time, + + + update_by, + + + class_name, + + + class_alias, + + + is_enable, + + + class_sort, + + + + + #{confItem,jdbcType=VARCHAR}, + + + #{confUnit,jdbcType=BIGINT}, + + + #{confUnitType,jdbcType=INTEGER}, + + + #{confValue,jdbcType=VARCHAR}, + + + #{confGroup,jdbcType=VARCHAR}, + + + #{confGroupSort,jdbcType=INTEGER}, + + + #{confGroupName,jdbcType=VARCHAR}, + + + #{confSort,jdbcType=INTEGER}, + + + #{confRemark,jdbcType=VARCHAR}, + + + #{confIsEditor,jdbcType=INTEGER}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{updateBy,jdbcType=VARCHAR}, + + + #{className,jdbcType=VARCHAR}, + + + #{classAlias,jdbcType=VARCHAR}, + + + #{isEnable,jdbcType=INTEGER}, + + + #{classSort,jdbcType=INTEGER}, + + + + + update sys_unit_config + + + conf_unit_type = #{confUnitType,jdbcType=INTEGER}, + + + conf_value = #{confValue,jdbcType=VARCHAR}, + + + conf_group = #{confGroup,jdbcType=VARCHAR}, + + + conf_group_sort = #{confGroupSort,jdbcType=INTEGER}, + + + conf_group_name = #{confGroupName,jdbcType=VARCHAR}, + + + conf_sort = #{confSort,jdbcType=INTEGER}, + + + conf_remark = #{confRemark,jdbcType=VARCHAR}, + + + conf_is_editor = #{confIsEditor,jdbcType=INTEGER}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + update_by = #{updateBy,jdbcType=VARCHAR}, + + + class_name = #{className,jdbcType=VARCHAR}, + + + class_alias = #{classAlias,jdbcType=VARCHAR}, + + + is_enable = #{isEnable,jdbcType=INTEGER}, + + + class_sort = #{classSort,jdbcType=INTEGER}, + + + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + update sys_unit_config + set conf_unit_type = #{confUnitType,jdbcType=INTEGER}, + conf_value = #{confValue,jdbcType=VARCHAR}, + conf_group = #{confGroup,jdbcType=VARCHAR}, + conf_group_sort = #{confGroupSort,jdbcType=INTEGER}, + conf_group_name = #{confGroupName,jdbcType=VARCHAR}, + conf_sort = #{confSort,jdbcType=INTEGER}, + conf_remark = #{confRemark,jdbcType=VARCHAR}, + conf_is_editor = #{confIsEditor,jdbcType=INTEGER}, + update_time = #{updateTime,jdbcType=TIMESTAMP}, + update_by = #{updateBy,jdbcType=VARCHAR}, + class_name = #{className,jdbcType=VARCHAR}, + class_alias = #{classAlias,jdbcType=VARCHAR}, + is_enable = #{isEnable,jdbcType=INTEGER}, + class_sort = #{classSort,jdbcType=INTEGER} + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_unit_config set is_enable =0 where conf_unit=#{unit_id} and class_alias=#{class_alias} + + + + delete from sys_unit_config where conf_unit=#{unit_id} and conf_group=#{conf_group} + + + + insert into sys_unit_config (conf_unit, conf_unit_type,conf_item,conf_value,conf_group,conf_group_name,conf_remark,conf_is_editor,class_name,class_alias,is_enable) + values + + (#{item.conf_unit},#{item.conf_unit_type},#{item.conf_item},#{item.conf_value},#{item.conf_group} ,#{item.conf_group_name},#{item.conf_remark},#{item.conf_is_editor},#{item.class_name},#{item.class_alias},#{item.is_enable}) + + + + + delete from sys_unit_config where conf_unit=#{unit_id} and conf_item=#{key} + + + + +insert into sys_unit_config(conf_unit,conf_unit_type,conf_item,conf_value,conf_is_editor,is_enable)values(#{unit_id},1,#{key},#{value},0,1) + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml new file mode 100644 index 0000000..ae5d4ef --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id, unit_id, order_no, source_acc_id, source_bank_no, source_card, target_acc_id, bank_type, pay_receipt_id , + target_card, target_bank_no, amount, add_time, result, remark, tran_time, target_acc_name, reason, pay_receipt + + + + + + + delete from acc_transaction_log + where id = #{id,jdbcType=BIGINT} + + + insert into acc_transaction_log (id, unit_id, order_no, + source_acc_id, source_bank_no, source_card, + target_acc_id, target_card, target_bank_no, + amount, add_time, result, + remark, tran_time) + values (#{id,jdbcType=BIGINT}, #{unitId,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, + #{sourceAccId,jdbcType=INTEGER}, #{sourceBankNo,jdbcType=VARCHAR}, #{sourceCard,jdbcType=VARCHAR}, + #{targetAccId,jdbcType=INTEGER}, #{targetCard,jdbcType=VARCHAR}, #{targetBankNo,jdbcType=VARCHAR}, + #{amount,jdbcType=BIGINT}, #{addTime,jdbcType=TIMESTAMP}, #{result,jdbcType=SMALLINT}, + #{remark,jdbcType=VARCHAR}, #{tranTime,jdbcType=TIMESTAMP}) + + + insert into acc_transaction_log + + + id, + + + unit_id, + + + order_no, + + + source_acc_id, + + + source_bank_no, + + + source_card, + + + target_acc_id, + + + target_card, + + + target_bank_no, + + + target_acc_name, + + + amount, + + + add_time, + + + result, + + + remark, + + + tran_time, + + + reason, + + + bank_type, + + + + + #{id,jdbcType=BIGINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{orderNo,jdbcType=VARCHAR}, + + + #{sourceAccId,jdbcType=INTEGER}, + + + #{sourceBankNo,jdbcType=VARCHAR}, + + + #{sourceCard,jdbcType=VARCHAR}, + + + #{targetAccId,jdbcType=INTEGER}, + + + #{targetCard,jdbcType=VARCHAR}, + + + #{targetBankNo,jdbcType=VARCHAR}, + + + #{targetAccName,jdbcType=VARCHAR}, + + + #{amount,jdbcType=BIGINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{result,jdbcType=SMALLINT}, + + + #{remark,jdbcType=VARCHAR}, + + + #{tranTime,jdbcType=TIMESTAMP}, + + + #{reason,jdbcType=VARCHAR}, + + + #{bankType,jdbcType=VARCHAR}, + + + + + update acc_transaction_log + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + order_no = #{orderNo,jdbcType=VARCHAR}, + + + source_acc_id = #{sourceAccId,jdbcType=INTEGER}, + + + source_bank_no = #{sourceBankNo,jdbcType=VARCHAR}, + + + source_card = #{sourceCard,jdbcType=VARCHAR}, + + + target_acc_id = #{targetAccId,jdbcType=INTEGER}, + + + target_card = #{targetCard,jdbcType=VARCHAR}, + + + target_bank_no = #{targetBankNo,jdbcType=VARCHAR}, + + + amount = #{amount,jdbcType=BIGINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + result = #{result,jdbcType=SMALLINT}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + + + reason = #{reason,jdbcType=VARCHAR}, + + + pay_receipt_id = #{payReceiptId,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update acc_transaction_log + set unit_id = #{unitId,jdbcType=BIGINT}, + order_no = #{orderNo,jdbcType=VARCHAR}, + source_acc_id = #{sourceAccId,jdbcType=INTEGER}, + source_bank_no = #{sourceBankNo,jdbcType=VARCHAR}, + source_card = #{sourceCard,jdbcType=VARCHAR}, + target_acc_id = #{targetAccId,jdbcType=INTEGER}, + target_card = #{targetCard,jdbcType=VARCHAR}, + target_bank_no = #{targetBankNo,jdbcType=VARCHAR}, + amount = #{amount,jdbcType=BIGINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + result = #{result,jdbcType=SMALLINT}, + remark = #{remark,jdbcType=VARCHAR}, + tran_time = #{tranTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + update acc_transaction_log set pay_receipt = + + when '${item.targetBankNo}' then '${item.payReceipt}' + + where bank_type = '${bankType}' and target_bank_no in + + '${item.targetBankNo}' + + + + + UPDATE acc_transaction_log + SET result = 0 + WHERE + result = -1 + AND id = #{id,jdbcType=BIGINT} + + + + UPDATE acc_transaction_log + SET result = -1 + WHERE + result = 0 + AND id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java b/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java new file mode 100644 index 0000000..e25d0ca --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java @@ -0,0 +1,40 @@ +package org.dromara.settlement; + +import cn.hutool.core.codec.Base64; +import org.dromara.settlement.service.impl.ZhaoShangServiceImpl; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title Test + * @description + * @create 2024-07-28 14:13 + */ + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class Test { + + + + @Resource + private ZhaoShangServiceImpl zhaoShangService; + + + + @org.junit.jupiter.api.Test + public void test(){ + +// this.zhaoShangService.synAccountOld(1811245410163494912L,"655905386710005","6000000002"); +// this.zhaoShangService.delAccount(1811245410163494912L,"655905386710005","3000000003"); +// System.out.println(); + + + + } +} diff --git a/ruoyi-modules/ruoyi-system/Dockerfile b/ruoyi-modules/ruoyi-system/Dockerfile new file mode 100644 index 0000000..2989fbf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/system/logs \ + /ruoyi/system/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/system + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-system.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml new file mode 100644 index 0000000..20d5055 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -0,0 +1,140 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-system + + + ruoyi-system系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java new file mode 100644 index 0000000..7e38306 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java @@ -0,0 +1,24 @@ +package org.dromara.system; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiSystemApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiSystemApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 系统模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java new file mode 100644 index 0000000..51ca79d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -0,0 +1,55 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.vo.CacheListInfoVo; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +/** + * 缓存监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/cache") +public class CacheController { + + private final RedissonConnectionFactory connectionFactory; + + /** + * 获取缓存监控列表 + */ + @SaCheckPermission("monitor:cache:list") + @GetMapping() + public R getInfo() throws Exception { + RedisConnection connection = connectionFactory.getConnection(); + Properties commandStats = connection.commands().info("commandstats"); + + List> pieList = new ArrayList<>(); + if (commandStats != null) { + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + } + + CacheListInfoVo infoVo = new CacheListInfoVo(); + infoVo.setInfo(connection.commands().info()); + infoVo.setDbSize(connection.commands().dbSize()); + infoVo.setCommandStats(pieList); + return R.ok(infoVo); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..0f23e5c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -0,0 +1,89 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 系统访问记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/logininfor") +public class SysLogininforController extends BaseController { + + private final ISysLogininforService logininforService; + + /** + * 获取系统访问记录列表 + */ + @SaCheckPermission("monitor:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); + } + + /** + * 导出系统访问记录列表 + */ + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:logininfor:export") + @PostMapping("/export") + public void export(SysLogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); + } + + /** + * 批量删除登录日志 + * @param infoIds 日志ids + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public R remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + /** + * 清理系统访问记录 + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + logininforService.cleanLogininfor(); + return R.ok(); + } + + @SaCheckPermission("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public R unlock(@PathVariable("userName") String userName) { + String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName; + if (RedisUtils.hasKey(loginName)) { + RedisUtils.deleteObject(loginName); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..5af1a01 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -0,0 +1,75 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operlog") +public class SysOperlogController extends BaseController { + + private final ISysOperLogService operLogService; + + /** + * 获取操作日志记录列表 + */ + @SaCheckPermission("monitor:operlog:list") + @GetMapping("/list") + public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { + return operLogService.selectPageOperLogList(operLog, pageQuery); + } + + /** + * 导出操作日志记录列表 + */ + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:operlog:export") + @PostMapping("/export") + public void export(SysOperLogBo operLog, HttpServletResponse response) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); + } + + /** + * 批量删除操作日志记录 + * @param operIds 日志ids + */ + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/{operIds}") + public R remove(@PathVariable Long[] operIds) { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + /** + * 清理操作日志记录 + */ + @SaCheckPermission("monitor:operlog:remove") + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + operLogService.cleanOperLog(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..3ea4b91 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,89 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.api.domain.SysUserOnline; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 在线用户监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/online") +public class SysUserOnlineController extends BaseController { + + /** + * 获取在线用户监控列表 + * + * @param ipaddr IP地址 + * @param userName 用户名 + */ + @SaCheckPermission("monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + // 获取所有未过期的 token + List keys = StpUtil.searchTokenValue("", 0, -1, false); + List userOnlineDTOList = new ArrayList<>(); + for (String key : keys) { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + continue; + } + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + } + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) + ); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退用户 + * + * @param tokenId token值 + */ + @SaCheckPermission("monitor:online:forceLogout") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException ignored) { + } + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java new file mode 100644 index 0000000..a1e7fab --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java @@ -0,0 +1,122 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.system.service.ISysAreaService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 区域 + * 前端访问路由地址为:/system/area + * + * @author LionLi + * @date 2024-04-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/area") +public class SysAreaController extends BaseController { + + private final ISysAreaService sysAreaService; + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-19 15:10 + * 说明:省市级联 + **/ + @PostMapping("/queryList") + @Log(title = "区域查询", businessType = BusinessType.OTHER) + public R> queryList(SysAreaBo bo){ + return R.ok(this.sysAreaService.queryList(bo)); + } + +// +// /** +// * 查询区域列表 +// */ +// @SaCheckPermission("system:area:list") +// @GetMapping("/list") +// public TableDataInfo list(SysAreaBo bo, PageQuery pageQuery) { +// return sysAreaService.queryPageList(bo, pageQuery); +// } +// +// /** +// * 导出区域列表 +// */ +// @SaCheckPermission("system:area:export") +// @Log(title = "区域", businessType = BusinessType.EXPORT) +// @PostMapping("/export") +// public void export(SysAreaBo bo, HttpServletResponse response) { +// List list = sysAreaService.queryList(bo); +// ExcelUtil.exportExcel(list, "区域", SysAreaVo.class, response); +// } +// +// /** +// * 获取区域详细信息 +// * +// * @param areaId 主键 +// */ +// @SaCheckPermission("system:area:query") +// @GetMapping("/{areaId}") +// public R getInfo(@NotNull(message = "主键不能为空") +// @PathVariable Long areaId) { +// return R.ok(sysAreaService.queryById(areaId)); +// } +// +// /** +// * 新增区域 +// */ +// @SaCheckPermission("system:area:add") +// @Log(title = "区域", businessType = BusinessType.INSERT) +// @RepeatSubmit() +// @PostMapping() +// public R add(@Validated(AddGroup.class) @RequestBody SysAreaBo bo) { +// return toAjax(sysAreaService.insertByBo(bo)); +// } +// +// /** +// * 修改区域 +// */ +// @SaCheckPermission("system:area:edit") +// @Log(title = "区域", businessType = BusinessType.UPDATE) +// @RepeatSubmit() +// @PutMapping() +// public R edit(@Validated(EditGroup.class) @RequestBody SysAreaBo bo) { +// return toAjax(sysAreaService.updateByBo(bo)); +// } +// +// /** +// * 删除区域 +// * +// * @param areaIds 主键串 +// */ +// @SaCheckPermission("system:area:remove") +// @Log(title = "区域", businessType = BusinessType.DELETE) +// @DeleteMapping("/{areaIds}") +// public R remove(@NotEmpty(message = "主键不能为空") +// @PathVariable Long[] areaIds) { +// return toAjax(sysAreaService.deleteWithValidByIds(List.of(areaIds), true)); +// } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java new file mode 100644 index 0000000..c8938e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -0,0 +1,115 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.service.ISysClientService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客户端管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/client") +public class SysClientController extends BaseController { + + private final ISysClientService sysClientService; + + /** + * 查询客户端管理列表 + */ + @SaCheckPermission("system:client:list") + @GetMapping("/list") + public TableDataInfo list(SysClientBo bo, PageQuery pageQuery) { + return sysClientService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户端管理列表 + */ + @SaCheckPermission("system:client:export") + @Log(title = "客户端管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysClientBo bo, HttpServletResponse response) { + List list = sysClientService.queryList(bo); + ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); + } + + /** + * 获取客户端管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysClientService.queryById(id)); + } + + /** + * 新增客户端管理 + */ + @SaCheckPermission("system:client:add") + @Log(title = "客户端管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.insertByBo(bo)); + } + + /** + * 修改客户端管理 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateUserStatus(bo.getId(), bo.getStatus())); + } + + /** + * 删除客户端管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:client:remove") + @Log(title = "客户端管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java new file mode 100644 index 0000000..1d7878b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -0,0 +1,137 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.service.ISysConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/config") +public class SysConfigController extends BaseController { + + private final ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @SaCheckPermission("system:config:list") + @GetMapping("/list") + public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); + } + + /** + * 导出参数配置列表 + */ + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:config:export") + @PostMapping("/export") + public void export(SysConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); + } + + /** + * 根据参数编号获取详细信息 + * + * @param configId 参数ID + */ + @SaCheckPermission("system:config:query") + @GetMapping(value = "/{configId}") + public R getInfo(@PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + * + * @param configKey 参数Key + */ + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok("操作成功", configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @SaCheckPermission("system:config:add") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.insertConfig(config); + return R.ok(); + } + + /** + * 修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.updateConfig(config); + return R.ok(); + } + + /** + * 根据参数键名修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody SysConfigBo config) { + configService.updateConfig(config); + return R.ok(); + } + + /** + * 删除参数配置 + * + * @param configIds 参数ID串 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public R remove(@PathVariable Long[] configIds) { + configService.deleteConfigByIds(configIds); + return R.ok(); + } + + /** + * 刷新参数缓存 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + configService.resetConfigCache(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java new file mode 100644 index 0000000..cf60988 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -0,0 +1,123 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.service.ISysDeptService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dept") +public class SysDeptController extends BaseController { + + private final ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list") + public R> list(SysDeptBo dept) { + List depts = deptService.selectDeptList(dept); + return R.ok(depts); + } + + /** + * 查询部门列表(排除节点) + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) + || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); + return R.ok(depts); + } + + /** + * 根据部门编号获取详细信息 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:query") + @GetMapping(value = "/{deptId}") + public R getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return R.ok(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @SaCheckPermission("system:dept:add") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDeptBo dept) { + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @SaCheckPermission("system:dept:edit") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDeptBo dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) { + if (deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); + } else if (deptService.checkDeptExistUser(deptId)) { + return R.fail("该部门下存在已分配用户,不能禁用!"); + } + } + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:remove") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public R remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return R.warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return R.warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java new file mode 100644 index 0000000..f978e91 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -0,0 +1,117 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dict/data") +public class SysDictDataController extends BaseController { + + private final ISysDictDataService dictDataService; + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); + } + + /** + * 导出字典数据列表 + */ + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); + } + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictCode}") + public R getInfo(@PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictDataBo dict) { + dictDataService.insertDictData(dict); + return R.ok(); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictDataBo dict) { + dictDataService.updateDictData(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public R remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..1e51539 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -0,0 +1,125 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dict/type") +public class SysDictTypeController extends BaseController { + + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); + } + + /** + * 导出字典类型列表 + */ + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictId}") + public R getInfo(@PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return R.ok(); + } + + /** + * 修改字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateDictType(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public R remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return R.ok(); + } + + /** + * 刷新字典缓存 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return R.ok(dictTypes); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java new file mode 100644 index 0000000..d55e820 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java @@ -0,0 +1,118 @@ +package org.dromara.system.controller.system; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.service.ISysIndustryService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 行业字典信息 + * 前端访问路由地址为:/system/industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/industry") +public class SysIndustryController extends BaseController { + + private final ISysIndustryService sysIndustryService; + + + /*** + * 查询行业字典信息列表 + * @return + */ + @GetMapping("/selList") + @Log(title = "查询行业字典信息", businessType = BusinessType.OTHER) + public R> selectIndustryList() { + return R.ok(sysIndustryService.selectIndustryList()); + } +// +// /** +// * 查询行业字典信息列表 +// */ +// @SaCheckPermission("system:industry:list") +// @GetMapping("/list") +// public TableDataInfo list(SysIndustryBo bo, PageQuery pageQuery) { +// return sysIndustryService.queryPageList(bo, pageQuery); +// } +// +// /** +// * 导出行业字典信息列表 +// */ +// @SaCheckPermission("system:industry:export") +// @Log(title = "行业字典信息", businessType = BusinessType.EXPORT) +// @PostMapping("/export") +// public void export(SysIndustryBo bo, HttpServletResponse response) { +// List list = sysIndustryService.queryList(bo); +// ExcelUtil.exportExcel(list, "行业字典信息", SysIndustryVo.class, response); +// } +// +// /** +// * 获取行业字典信息详细信息 +// * +// * @param id 主键 +// */ +// @SaCheckPermission("system:industry:query") +// @GetMapping("/{id}") +// public R getInfo(@NotNull(message = "主键不能为空") +// @PathVariable Long id) { +// return R.ok(sysIndustryService.queryById(id)); +// } +// +// /** +// * 新增行业字典信息 +// */ +// @SaCheckPermission("system:industry:add") +// @Log(title = "行业字典信息", businessType = BusinessType.INSERT) +// @RepeatSubmit() +// @PostMapping() +// public R add(@Validated(AddGroup.class) @RequestBody SysIndustryBo bo) { +// return toAjax(sysIndustryService.insertByBo(bo)); +// } +// +// /** +// * 修改行业字典信息 +// */ +// @SaCheckPermission("system:industry:edit") +// @Log(title = "行业字典信息", businessType = BusinessType.UPDATE) +// @RepeatSubmit() +// @PutMapping() +// public R edit(@Validated(EditGroup.class) @RequestBody SysIndustryBo bo) { +// return toAjax(sysIndustryService.updateByBo(bo)); +// } +// +// /** +// * 删除行业字典信息 +// * +// * @param ids 主键串 +// */ +// @SaCheckPermission("system:industry:remove") +// @Log(title = "行业字典信息", businessType = BusinessType.DELETE) +// @DeleteMapping("/{ids}") +// public R remove(@NotEmpty(message = "主键不能为空") +// @PathVariable Long[] ids) { +// return toAjax(sysIndustryService.deleteWithValidByIds(List.of(ids), true)); +// } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java new file mode 100644 index 0000000..31a354c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -0,0 +1,192 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.lang.tree.Tree; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MenuTreeSelectVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.service.ISysMenuService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/menu") +public class SysMenuController extends BaseController { + + private final ISysMenuService menuService; + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("/getRouters") + public R> getRouters() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(),loginUser.getRoleDataRange()); + return R.ok(menuService.buildMenus(menus)); + } + + /** + * 获取菜单列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:list") + @GetMapping("/list") + public R> list(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/{menuId}") + public R getInfo(@PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @SaCheckPermission("system:menu:query") + @GetMapping("/treeselect") + public R>> treeselect(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId(),roleId); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + + /** + * 加载操作员对应角色菜单列表树 + * + */ + @SaCheckPermission("system:menu:oper:query") + @GetMapping(value = "/userMenuTreeselect/{uid}") + public R userMenuTreeselect(@PathVariable("uid") Long uid) { + SysMenuBo smb = new SysMenuBo(); + List menus = menuService.selectCurrentUserMenuList(smb,LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByUserId(uid)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId(),null); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 新增菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:add") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:edit") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:remove") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public R remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return R.warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return R.warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java new file mode 100644 index 0000000..76da8d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -0,0 +1,100 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.DictService; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/notice") +public class SysNoticeController extends BaseController { + + private final ISysNoticeService noticeService; + private final DictService dictService; + + @DubboReference + private final RemoteMessageService remoteMessageService; + + /** + * 获取通知公告列表 + */ + @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + +// @SaCheckPermission("system:notice:listByUser") + @GetMapping("/listByUser") + public TableDataInfo listByUser(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeListByUser(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ +// @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysNoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); + remoteMessageService.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ + @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysNoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ + @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java new file mode 100644 index 0000000..9932cb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -0,0 +1,121 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.ISysPostService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/post") +public class SysPostController extends BaseController { + + private final ISysPostService postService; + + /** + * 获取岗位列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/list") + public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); + } + + /** + * 导出岗位列表 + */ + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:post:export") + @PostMapping("/export") + public void export(SysPostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); + } + + /** + * 根据岗位编号获取详细信息 + * + * @param postId 岗位ID + */ + @SaCheckPermission("system:post:query") + @GetMapping(value = "/{postId}") + public R getInfo(@PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @SaCheckPermission("system:post:edit") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } else if (UserConstants.POST_DISABLE.equals(post.getStatus()) + && postService.countUserPostById(post.getPostId()) > 0) { + return R.fail("该岗位下存在已分配用户,不能禁用!"); + } + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + * + * @param postIds 岗位ID串 + */ + @SaCheckPermission("system:post:remove") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public R remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + SysPostBo postBo = new SysPostBo(); + postBo.setStatus(UserConstants.POST_NORMAL); + List posts = postService.selectPostList(postBo); + return R.ok(posts); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java new file mode 100644 index 0000000..fa74f4b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -0,0 +1,135 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.bo.SysUserPasswordBo; +import org.dromara.system.domain.bo.SysUserProfileBo; +import org.dromara.system.domain.vo.AvatarVo; +import org.dromara.system.domain.vo.ProfileVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; + +/** + * 个人信息 业务处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/user/profile") +public class SysProfileController extends BaseController { + + private final ISysUserService userService; + + @DubboReference + private RemoteFileService remoteFileService; + + /** + * 个人信息 + */ + @GetMapping + public R profile() { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + ProfileVo profileVo = new ProfileVo(); + profileVo.setUser(user); + profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserName())); + profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserName())); + return R.ok(profileVo); + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public R updateProfile(@RequestBody SysUserProfileBo profile) { + SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); + String username = LoginHelper.getUsername(); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + username + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); + } + user.setUserId(LoginHelper.getUserId()); + if (userService.updateUserProfile(user) > 0) { + return R.ok(); + } + return R.fail("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + * + * @param bo 新旧密码 + */ + @ApiEncrypt + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public R updatePwd(@Validated @RequestBody SysUserPasswordBo bo) { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + String password = user.getPassword(); + if (!BCrypt.checkpw(bo.getOldPassword(), password)) { + return R.fail("修改密码失败,旧密码错误"); + } + if (BCrypt.checkpw(bo.getNewPassword(), password)) { + return R.fail("新密码不能与旧密码相同"); + } + + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword())) > 0) { + return R.ok(); + } + return R.fail("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + * + * @param avatarfile 用户头像 + */ + @GlobalTransactional(rollbackFor = Exception.class) + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) throws IOException { + if (!avatarfile.isEmpty()) { + String extension = FileUtil.extName(avatarfile.getOriginalFilename()); + if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { + return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); + } + RemoteFile oss = remoteFileService.upload(avatarfile.getName(), avatarfile.getOriginalFilename(), avatarfile.getContentType(), avatarfile.getBytes()); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { + AvatarVo avatarVo = new AvatarVo(); + avatarVo.setImgUrl(avatar); + return R.ok(avatarVo); + } + } + return R.fail("上传图片异常,请联系管理员"); + } + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java new file mode 100644 index 0000000..2ca7679 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -0,0 +1,228 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.DeptTreeSelectVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysRoleService; +import org.dromara.system.service.ISysUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 角色信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/role") +public class SysRoleController extends BaseController { + + private final ISysRoleService roleService; + private final ISysUserService userService; + private final ISysDeptService deptService; + + /** + * 获取角色信息列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/list") + public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); + } + + /** + * 导出角色信息列表 + */ + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:role:export") + @PostMapping("/export") + public void export(SysRoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); + } + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:query") + @GetMapping(value = "/{roleId}") + public R getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return R.ok(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @SaCheckPermission("system:role:add") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + if (roleService.updateRole(role) > 0) { + roleService.cleanOnlineUserByRole(role.getRoleId()); + return R.ok(); + } + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public R dataScope(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:remove") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public R remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public R> optionselect() { + return R.ok(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); + } + + /** + * 查询未分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); + } + + /** + * 取消授权用户 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public R cancelAuthUser(@RequestBody SysUserRole userRole) { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public R cancelAuthUserAll(Long roleId, Long[] userIds) { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + return R.ok(selectVo); + } +} + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java new file mode 100644 index 0000000..0d95d0e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java @@ -0,0 +1,38 @@ +package org.dromara.system.controller.system; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.service.ISysSocialService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 社会化关系 + * + * @author thiszhc + * @date 2023-06-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/social") +public class SysSocialController extends BaseController { + + private final ISysSocialService socialUserService; + + /** + * 查询社会化关系列表 + */ + @GetMapping("/list") + public R> list() { + return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java new file mode 100644 index 0000000..0d43114 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -0,0 +1,178 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import com.baomidou.lock.annotation.Lock4j; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tenant") +public class SysTenantController extends BaseController { + + private final ISysTenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { + return tenantService.queryPageList(bo, pageQuery); + } + + /** + * 导出租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:export") + @Log(title = "租户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + } + + /** + * 获取租户详细信息 + * + * @param id 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tenantService.queryById(id)); + } + + /** + * 新增租户 + */ + @ApiEncrypt + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:add") + @Log(title = "租户", businessType = BusinessType.INSERT) + @Lock4j + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); + } + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); + } + + /** + * 修改租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); + } + return toAjax(tenantService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + return toAjax(tenantService.updateTenantStatus(bo)); + } + + /** + * 删除租户 + * + * @param ids 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:remove") + @Log(title = "租户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tenantService.deleteWithValidByIds(Arrays.asList(ids), true)); + } + + /** + * 动态切换租户 + * + * @param tenantId 租户ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/{tenantId}") + public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { + TenantHelper.setDynamic(tenantId); + return R.ok(); + } + + /** + * 清除动态租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/clear") + public R dynamicClear() { + TenantHelper.clearDynamic(); + return R.ok(); + } + + + /** + * 同步租户套餐 + * + * @param tenantId 租户id + * @param packageId 套餐id + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @GetMapping("/syncTenantPackage") + public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, + @NotNull(message = "套餐ID不能为空") Long packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java new file mode 100644 index 0000000..d01a4b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -0,0 +1,135 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户套餐管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tenant/package") +public class SysTenantPackageController extends BaseController { + + private final ISysTenantPackageService tenantPackageService; + + /** + * 查询租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) { + return tenantPackageService.queryPageList(bo, pageQuery); + } + + /** + * 查询租户套餐下拉选列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/selectList") + public R> selectList() { + return R.ok(tenantPackageService.selectList()); + } + + /** + * 导出租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:export") + @Log(title = "租户套餐", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantPackageBo bo, HttpServletResponse response) { + List list = tenantPackageService.queryList(bo); + ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); + } + + /** + * 获取租户套餐详细信息 + * + * @param packageId 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:query") + @GetMapping("/{packageId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long packageId) { + return R.ok(tenantPackageService.queryById(packageId)); + } + + /** + * 新增租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:add") + @Log(title = "租户套餐", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.insertByBo(bo)); + } + + /** + * 修改租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updatePackageStatus(bo)); + } + + /** + * 删除租户套餐 + * + * @param packageIds 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:remove") + @Log(title = "租户套餐", businessType = BusinessType.DELETE) + @DeleteMapping("/{packageIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] packageIds) { + return toAjax(tenantPackageService.deleteWithValidByIds(Arrays.asList(packageIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java new file mode 100644 index 0000000..faae3c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java @@ -0,0 +1,116 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.system.service.ISysUnitDomainService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 单位域名配置 + * 前端访问路由地址为:/system/unitDomain + * + * @author LionLi + * @date 2024-03-29 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unitDomain") +public class SysUnitDomainController extends BaseController { + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 查询单位域名配置列表 + */ + @SaCheckPermission("system:unitDomain:list") + @GetMapping("/list") + public TableDataInfo list(SysUnitDomainBo bo, PageQuery pageQuery) { + return sysUnitDomainService.queryPageList(bo, pageQuery); + } + + /** + * 导出单位域名配置列表 + */ + @SaCheckPermission("system:unitDomain:export") + @Log(title = "单位域名配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysUnitDomainBo bo, HttpServletResponse response) { + List list = sysUnitDomainService.queryList(bo); + ExcelUtil.exportExcel(list, "单位域名配置", SysUnitDomainVo.class, response); + } + + /** + * 获取单位域名配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:unitDomain:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysUnitDomainService.queryById(id)); + } + + /** + * 根据域名获取站点配置信息 + * @param domain 域名地址 + * @return + */ + @PostMapping("/queryByDomain") + public R queryByDomainName(@NotBlank(message = "域名不能为空") String domain) { + return R.ok(sysUnitDomainService.queryByDomainName(domain)); + } + + /** + * 新增单位域名配置 + */ + @SaCheckPermission("system:unitDomain:add") + @Log(title = "单位域名配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysUnitDomainBo bo) { + return toAjax(sysUnitDomainService.insertByBo(bo)); + } + + /** + * 修改单位域名配置 + */ + @SaCheckPermission("system:unitDomain:edit") + @Log(title = "单位域名配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysUnitDomainBo bo) { + return toAjax(sysUnitDomainService.updateByBo(bo)); + } + + /** + * 删除单位域名配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:unitDomain:remove") + @Log(title = "单位域名配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysUnitDomainService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java new file mode 100644 index 0000000..d701168 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -0,0 +1,527 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.DesensitizedUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.bo.*; +import org.dromara.system.domain.vo.*; +import org.dromara.system.listener.SysUserImportListener; +import org.dromara.system.service.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/user") +public class SysUserController extends BaseController { + + private final ISysUserService userService; + private final ISysRoleService roleService; + private final ISysPostService postService; + private final ISysDeptService deptService; + private final ISysTenantService tenantService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list") + public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } + + + /** + * 获取操作员表 + */ + @SaCheckPermission("system:user:listNew") + @GetMapping("/listNew") + public TableDataInfo listNew(SysUserBo user, PageQuery pageQuery) { + return userService.selNewUserList(user, pageQuery); + } + + + /** + * 导出用户列表 + */ + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:user:export") + @PostMapping("/export") + public void export(SysUserBo user, HttpServletResponse response) { + List list = userService.selectUserList(user); + List listVo = MapstructUtils.convert(list, SysUserExportVo.class); + ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:user:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("/getInfo") + public R getInfo() { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + UserInfoVo userInfoVo = new UserInfoVo(); + + SysUserVo user = userService.selectUserById(loginUser.getUserId()); + if (ObjectUtil.isNull(user)) { + return R.fail("没有权限访问用户数据!"); + } + userInfoVo.setUser(user); + userInfoVo.setPermissions(loginUser.getMenuPermission()); + userInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(userInfoVo); + } + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { + userService.checkUserDataScope(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + SysRoleBo roleBo = new SysRoleBo(); + roleBo.setStatus(UserConstants.ROLE_NORMAL); + SysPostBo postBo = new SysPostBo(); + postBo.setStatus(UserConstants.POST_NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + userInfoVo.setPosts(postService.selectPostList(postBo)); + if (ObjectUtil.isNotNull(userId)) { + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(StreamUtils.toList(sysUser.getRoles(), SysRoleVo::getRoleId)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + return R.ok(userInfoVo); + } + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:add") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysUserBo user) { + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + if (TenantHelper.isEnable()) { + if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { + return R.fail("当前租户下用户名额不足,请联系管理员"); + } + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:addNew") + @Log(title = "新增操作员", businessType = BusinessType.INSERT) + @PostMapping("/addNew") + public R addNew(@Validated @RequestBody SysUserBo user) { + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增操作员'" + user.getUserName() + "'失败,登录账号已存在"); + } + + if(!user.getPassword().equals(user.getRepwd())){ + return R.fail("密码与确认密码不一致"); + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + user.setRoleDataRange(2); + return toAjax(userService.insertUserNew(user)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:editNew") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/updNew") + public R editNew(@Validated @RequestBody SysUserBo user) { + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + return toAjax(userService.updateUserNew(user)); + } + + + + @Log(title = "更新管理员登录阅读协议标识", businessType = BusinessType.UPDATE) + @PutMapping("/updReadTag") + public R updateReadProTag(){ + return R.ok(this.userService.updateReadProTag()); + } + + + /** + * 删除用户 + * + * @param userIds 角色ID串 + */ + @SaCheckPermission("system:user:remove") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@PathVariable Long[] userIds) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { + return R.fail("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwd") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public R resetPwd(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwdNew") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwdNew") + public R resetPwdNew(@RequestBody SysUserBo user) { + + if(!user.getPassword().equals(user.getRepwd())){ + return R.fail("密码与确认密码不一致!"); + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + + /*** + * 操作员分配权限 + * @param user + * @return + */ + + @SaCheckPermission("system:user:cfgPer") + @Log(title = "用户管理-操作员分配权限", businessType = BusinessType.UPDATE) + @PostMapping("/cfgPer") + public R configUserPer(@RequestBody SysUserBo user){ + return toAjax(userService.configUserPer(user)); + } + + + /** + * 登录密码修改 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetMyPwd") + @Log(title = "登录密码修改", businessType = BusinessType.UPDATE) + @PutMapping("/resetMyPwd") + public R resetMyPwd(@RequestBody SysUserPasswordBo bo) { + return toAjax(userService.resetMyPwd(bo.getOldPassword(),bo.getNewPassword(),bo.getSurePwd())); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:status") + @Log(title = "用户管理-状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + + + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeSt") + public R changeSt(@RequestBody SysUserBo user) { + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public R authRole(@PathVariable Long userId) { + SysUserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return R.ok(); + } + + /** + * 获取部门树列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/deptTree") + public R>> deptTree(SysDeptBo dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取部门下的所有用户信息 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list/dept/{deptId}") + public R> listByDept(@PathVariable @NotNull Long deptId) { + return R.ok(userService.selectUserListByDept(deptId)); + } + + + + /*** + * 修改登录方式 + * @param loginType + * @return + */ + @SaCheckPermission("system:user:updLoginWay") + @GetMapping("/updLoginWay") + public R updLoginWay(Integer loginType){ + return toAjax(userService.updLoginWay(LoginHelper.getUserId(),loginType)); + } + + + + /*** + * 修改登录方式 + * @param loginType + * @return + */ +// @SaCheckPermission("system:user:updLoginWay") + @GetMapping("/selLoginWay") + public R selLoginWay(Integer loginType){ + return R.ok(userService.selLoginWay(LoginHelper.getUserId())); + } + + + /** + * 获取用户手机号 + * @param userName 用户名称 + */ + @PostMapping("/getPhonenumber") + public R getPhonenumber(@NotBlank(message = "用户名称不能为空") String userName) { + SysUserVo user = userService.selectUserByUserName(userName); + return R.ok("操作成功",user != null ? DesensitizedUtil.mobilePhone(user.getPhonenumber()) : null); + } + + /** + * 发送找回密码短信验证码 + * @param userName 用户名称 + * @return + */ + @PostMapping("/sendForgotSmsCode") + public R sendForgotSmsCode(@NotBlank(message = "站点名称不能为空") String domain,@NotBlank(message = "用户名称不能为空") String userName) { + SysUserVo user = userService.selectUserByUserName(userName); + if(user == null){ + throw new ServiceException("发送失败,用户名称不存在"); + } + SmsType smsType = SmsType.RESET_PWD; + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + LinkedHashMap map = new LinkedHashMap<>(); + map.put("code", code); + remoteSmsService.send(domain,user.getPhonenumber(),smsType,map); + return R.ok(); + } + + + /** + * 通过验证码找回密码 + * @param body + * @return + */ + @ApiEncrypt + @PostMapping("/forgotPassword") + public R forgotPassword(@RequestBody String body) { + JSONObject param = JSONObject.parseObject(body); + if(!param.containsKey("userName") || !param.containsKey("code") || !param.containsKey("password") || StringUtils.isBlank(param.getString("userName")) || StringUtils.isBlank(param.getString("code")) || StringUtils.isBlank(param.getString("password"))){ + throw new ServiceException("参数异常,操作失败"); + } + SysUserVo user = userService.selectUserByUserName(param.getString("userName")); + if(user == null){ + throw new ServiceException("用户不存在,操作失败"); + } + SmsType smsType = SmsType.RESET_PWD; + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RedisUtils.getCacheObject(key); + if(StringUtils.isBlank(code)){ + throw new ServiceException("验证码已失效"); + } + if (!code.equals(param.getString("code"))){ + throw new ServiceException("验证码不正确"); + } + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(param.getString("password"))) == 0) { + throw new ServiceException("操作失败"); + } + RedisUtils.deleteObject(key); + return R.ok(); + } + + + /*** + * 获取绑定二维码 + * @param domain + * @return + */ + @GetMapping("/getBindQr") + public R getQrCode(String domain){ + return R.ok(this.userService.getBindingQr(domain)); + } + + + + + /*** + * 绑定二维码 + * @param domain + * @return + */ + @PostMapping("/bindUserOpenId") + public R bindUserOpenId(String domain,String code,String username){ + return R.ok(this.userService.bindWeixinOpenId(domain,code,username)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java new file mode 100644 index 0000000..c9c25b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java @@ -0,0 +1,42 @@ +package org.dromara.system.domain; + +import java.io.Serializable; + +public class BpmOrderNum implements Serializable { + + private static final long serialVersionUID = 1L; + + private String dtm_time; + + private String v_process_name; + + private Long i_max_num; + + + + public String getDtm_time() { + return dtm_time; + } + + public void setDtm_time(String dtm_time) { + this.dtm_time = dtm_time; + } + + public String getV_process_name() { + return v_process_name; + } + + public void setV_process_name(String v_process_name) { + this.v_process_name = v_process_name; + } + + public Long getI_max_num() { + return i_max_num; + } + + public void setI_max_num(Long i_max_num) { + this.i_max_num = i_max_num; + } + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java new file mode 100644 index 0000000..c741766 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 区域对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_area") +public class SysArea extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区域id + */ + @TableId(value = "area_id") + private Long areaId; + + /** + * 区域名 + */ + private String areaName; + + /** + * 上级 + */ + private Long up; + + /** + * 级别 + */ + private Long level; + + /** + * 排序 + */ + private Long sort; + + /** + * 区域code + */ + private String code; + + /** + * 1 可用/ 0 不可用 + */ + private Integer isUse; + + /** + * 区域编码 + */ + private String areaCode; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java new file mode 100644 index 0000000..c659470 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 授权管理对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_client") +public class SysClient extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java new file mode 100644 index 0000000..df1355c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 参数配置表 sys_config + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_config") +public class SysConfig extends TenantEntity { + + /** + * 参数主键 + */ + @TableId(value = "config_id") + private Long configId; + + /** + * 参数名称 + */ + private String configName; + + /** + * 参数键名 + */ + private String configKey; + + /** + * 参数键值 + */ + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java new file mode 100644 index 0000000..9733500 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + + +/** + * 部门表 sys_dept + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dept") +public class SysDept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id") + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 祖级列表 + */ + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java new file mode 100644 index 0000000..5eb5ca1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_data") +public class SysDictData extends TenantEntity { + + /** + * 字典编码 + */ + @TableId(value = "dict_code") + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java new file mode 100644 index 0000000..dfd10a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java @@ -0,0 +1,41 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_type") +public class SysDictType extends TenantEntity { + + /** + * 字典主键 + */ + @TableId(value = "dict_id") + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java new file mode 100644 index 0000000..baf9861 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java @@ -0,0 +1,63 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 行业字典信息对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_industry") +public class SysIndustry extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 父ID + */ + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + private Integer isUse; + + /** + * 排序 + */ + private Long sort; + + /** + * 级别 + */ + private Integer level; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java new file mode 100644 index 0000000..c57dc0a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java @@ -0,0 +1,85 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@TableName("sys_logininfor") +public class SysLogininfor implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "info_id") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java new file mode 100644 index 0000000..94eabdc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -0,0 +1,194 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_menu") +public class SysMenu extends BaseEntity { + + /** + * 菜单ID + */ + @TableId(value = "menu_id") + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + /** + * 父菜单名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + + private String useType; + + /** + * 获取路由名称 + */ + public String getRouteName() { + String routerName = StringUtils.capitalize(path); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame()) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + */ + public String getRouterPath() { + String routerPath = this.path; + // 内链打开外网方式 + if (getParentId() != 0L && isInnerLink()) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0L == getParentId() && UserConstants.TYPE_DIR.equals(getMenuType()) + && UserConstants.NO_FRAME.equals(getIsFrame())) { + routerPath = "/" + this.path; + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame()) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + */ + public String getComponentInfo() { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { + component = this.component; + } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(this.component) && isParentView()) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + */ + public boolean isMenuFrame() { + return getParentId() == 0L && UserConstants.TYPE_MENU.equals(menuType) && isFrame.equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + */ + public boolean isInnerLink() { + return isFrame.equals(UserConstants.NO_FRAME) && StringUtils.ishttp(path); + } + + /** + * 是否为parent_view组件 + */ + public boolean isParentView() { + return getParentId() != 0L && UserConstants.TYPE_DIR.equals(menuType); + } + + /** + * 内链域名特殊字符替换 + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, + new String[]{"", "", "", "/", "/"}); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java new file mode 100644 index 0000000..b24829b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java @@ -0,0 +1,65 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + + +/** + * 通知公告表 sys_notice + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_notice") +public class SysNotice extends TenantEntity { + + /** + * 公告ID + */ + @TableId(value = "notice_id") + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java new file mode 100644 index 0000000..41a8c59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys_oper_log") +public class SysOperLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @TableId(value = "oper_id") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java new file mode 100644 index 0000000..7fe7039 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 sys_post + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_post") +public class SysPost extends TenantEntity { + + /** + * 岗位序号 + */ + @TableId(value = "post_id") + private Long postId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位排序 + */ + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java new file mode 100644 index 0000000..1b262a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +public class SysRole extends TenantEntity { + + /** + * 角色ID + */ + @TableId(value = "role_id") + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; + + public SysRole(Long roleId) { + this.roleId = roleId; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java new file mode 100644 index 0000000..ba77694 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和部门关联 sys_role_dept + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_dept") +public class SysRoleDept { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..ba28f17 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_menu") +public class SysRoleMenu { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java new file mode 100644 index 0000000..10f2936 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java @@ -0,0 +1,136 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 社会化关系对象 sys_social + * + * @author thiszhc + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_social") +public class SysSocial extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java new file mode 100644 index 0000000..94e5230 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -0,0 +1,103 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 租户对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant") +public class SysTenant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java new file mode 100644 index 0000000..5556d9f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -0,0 +1,56 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 租户套餐对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant_package") +public class SysTenantPackage extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @TableId(value = "package_id") + private Long packageId; + /** + * 套餐名称 + */ + private String packageName; + /** + * 关联菜单id + */ + private String menuIds; + /** + * 备注 + */ + private String remark; + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + /** + * 状态(0正常 1停用) + */ + private String status; + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java new file mode 100644 index 0000000..ccdc67c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java @@ -0,0 +1,140 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit_domain") +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + /** + * 短信配置 + */ + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 微信公众号配置 + */ + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; + + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java new file mode 100644 index 0000000..4748868 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -0,0 +1,179 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user") +public class SysUser extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + + /** + * 用户头像 + */ + private Long avatar; + + /** + * 密码 + */ + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + @TableField(value = "role_id") + private Long curRoleId; + + @TableField(value = "role_name") + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:37 + * 说明:主体编码 + **/ + private String busNo; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:38 + * 说明:角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + **/ + private Integer roleId; + + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + /** + * 是否支付密码(0:否 1:是) + */ + private Integer isResetPaypass; + + private String ids; + + private String roleName; + + public SysUser(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java new file mode 100644 index 0000000..ba2e00d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 角色和菜单关联对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user_menu") +public class SysUserMenu extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 菜单ID + */ + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java new file mode 100644 index 0000000..119c117 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和岗位关联 sys_user_post + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_post") +public class SysUserPost { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java new file mode 100644 index 0000000..0a50e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和角色关联 sys_user_role + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_role") +public class SysUserRole { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java new file mode 100644 index 0000000..f02b5bc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysArea; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 区域业务对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysArea.class, reverseConvertGenerate = false) +public class SysAreaBo extends BaseEntity { + + /** + * 区域id + */ + @NotNull(message = "区域id不能为空", groups = { EditGroup.class }) + private Long areaId; + + /** + * 区域名 + */ + @NotBlank(message = "区域名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String areaName; + + /** + * 上级 + */ + @NotNull(message = "上级不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long up; + + /** + * 级别 + */ + @NotNull(message = "级别不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 区域code + */ + @NotBlank(message = "区域code不能为空", groups = { AddGroup.class, EditGroup.class }) + private String code; + + /** + * 1 可用/ 0 不可用 + */ + @NotNull(message = "1 可用/ 0 不可用不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 区域编码 + */ + @NotBlank(message = "区域编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String areaCode; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java new file mode 100644 index 0000000..82a9180 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysClient; + +import java.util.List; + +/** + * 授权管理业务对象 sys_client + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysClient.class, reverseConvertGenerate = false) +public class SysClientBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + @NotBlank(message = "客户端key不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientKey; + + /** + * 客户端秘钥 + */ + @NotBlank(message = "客户端秘钥不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientSecret; + + /** + * 授权类型 + */ + @NotNull(message = "授权类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java new file mode 100644 index 0000000..4affa64 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysConfig; + +/** + * 参数配置业务对象 sys_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) +public class SysConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java new file mode 100644 index 0000000..a5031d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -0,0 +1,70 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDept; + +/** + * 部门业务对象 sys_dept + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDept.class, reverseConvertGenerate = false) +public class SysDeptBo extends BaseEntity { + + /** + * 部门id + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") + private String deptName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + @Size(min = 0, max = 11, message = "联系电话长度不能超过{max}个字符") + private String phone; + + /** + * 邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java new file mode 100644 index 0000000..042946c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictData; + +/** + * 字典数据业务对象 sys_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) +public class SysDictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java new file mode 100644 index 0000000..cfc82de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java @@ -0,0 +1,50 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictType; + +/** + * 字典类型业务对象 sys_dict_type + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictType.class, reverseConvertGenerate = false) +public class SysDictTypeBo extends BaseEntity { + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java new file mode 100644 index 0000000..56ff41a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java @@ -0,0 +1,62 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.system.domain.SysIndustry; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 行业字典信息业务对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysIndustry.class, reverseConvertGenerate = false) +public class SysIndustryBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 名称 + */ + @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 父ID + */ + @NotNull(message = "父ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + @NotNull(message = "是否可用 1 是 0 否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 级别 + */ + @NotNull(message = "级别不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer level; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java new file mode 100644 index 0000000..1cbe129 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -0,0 +1,87 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysLogininfor; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) +public class SysLogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java new file mode 100644 index 0000000..3872696 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -0,0 +1,111 @@ +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysMenu; + +/** + * 菜单权限业务对象 sys_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) +public class SysMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 路由地址 + */ + @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") + private String path; + + /** + * 组件路径 + */ + @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @NotBlank(message = "菜单类型不能为空") + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + + private String useType; + + /** + * 权限标识 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java new file mode 100644 index 0000000..9310e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysNotice; + +/** + * 通知公告业务对象 sys_notice + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) +public class SysNoticeBo extends BaseEntity { + + /** + * 公告ID + */ + private Long noticeId; + + private Integer[] busRoles; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过{max}个字符") + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + private Long userId; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + private Integer busRole; //(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + + /** + * 备注 + */ + private String remark; + + /** + * 创建人名称 + */ + private String createByName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java new file mode 100644 index 0000000..407947c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -0,0 +1,127 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.domain.SysOperLog; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class SysOperLogBo { + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java new file mode 100644 index 0000000..b93c39c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysPost; + +/** + * 岗位信息业务对象 sys_post + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysPost.class, reverseConvertGenerate = false) +public class SysPostBo extends BaseEntity { + + /** + * 岗位ID + */ + private Long postId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") + private String postName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java new file mode 100644 index 0000000..0c8b4dc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -0,0 +1,94 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysRole; + +/** + * 角色信息业务对象 sys_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) +public class SysRoleBo extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + public SysRoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java new file mode 100644 index 0000000..7784271 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -0,0 +1,142 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.system.domain.SysSocial; + +/** + * 社会化关系业务对象 sys_social + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false) +public class SysSocialBo extends TenantEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 的唯一ID + */ + @NotBlank(message = "的唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String authId; + + /** + * 用户来源 + */ + @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private String source; + + /** + * 用户的授权令牌 + */ + @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + @NotBlank(message = "用户的 ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java new file mode 100644 index 0000000..d98b3a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -0,0 +1,114 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysTenant; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.Date; + +/** + * 租户业务对象 sys_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) +public class SysTenantBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactUserName; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPhone; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 用户名(创建系统用户) + */ + @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) + private String username; + + /** + * 密码(创建系统用户) + */ + @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) + private String password; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java new file mode 100644 index 0000000..9086f5c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMapping; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysTenantPackage; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 租户套餐业务对象 sys_tenant_package + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false) +public class SysTenantPackageBo extends BaseEntity { + + /** + * 租户套餐id + */ + @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class }) + private Long packageId; + + /** + * 套餐名称 + */ + @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageName; + + /** + * 关联菜单id + */ + @AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.join(source.getMenuIds(), \",\"))") + private Long[] menuIds; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java new file mode 100644 index 0000000..0b012a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java @@ -0,0 +1,145 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 单位域名配置业务对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnitDomain.class, reverseConvertGenerate = false) +public class SysUnitDomainBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 域名地址 + */ + @NotBlank(message = "域名地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String domainName; + + /** + * 站点名称 + */ + @NotBlank(message = "站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String websiteName; + + /** + * 客服热线 + */ + @NotBlank(message = "客服热线不能为空", groups = { AddGroup.class, EditGroup.class }) + private String hotline; + + /** + * 版权信息 + */ + @NotBlank(message = "版权信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyright; + + /** + * 备案号 + */ + @NotBlank(message = "备案号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String recordNo; + + /** + * 备案号链接地址 + */ + @NotBlank(message = "备案号链接地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @NotBlank(message = "PC登录页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @NotBlank(message = "PC登录页广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @NotBlank(message = "PC主页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String homePageLogo; + + /** + * 手机端LOGO + */ + @NotBlank(message = "手机端LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapLogo; + + /** + * 手机端广告图 + */ + @NotBlank(message = "手机端广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @NotBlank(message = "微信公众号站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String weChatPub; + + /** + * 短信配置 + */ + @NotBlank(message = "短信配置不能为空", groups = { AddGroup.class, EditGroup.class }) + private String smsConfig; + + /** + * PC登录协议 + */ + @NotBlank(message = "PC登录协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @NotBlank(message = "手机端用户协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @NotBlank(message = "私有协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @NotNull(message = "状态(1:正常 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @NotNull(message = "主体id(结算中心id或运营商id或渠道商id或商户id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java new file mode 100644 index 0000000..a2f003a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -0,0 +1,145 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysUser; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) +public class SysUserBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "操作员账号不能包含脚本字符") + @NotBlank(message = "操作员户账号不能为空") + @Size(min = 0, max = 30, message = "操作员账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "操作员名称不能包含脚本字符") + @NotBlank(message = "操作员名称不能为空") + @Size(min = 0, max = 30, message = "操作员名称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 密码 + */ + private String password; + + /** + * 确认密码 + */ + private String repwd; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色组 + */ +// @Size(min = 1, message = "用户角色不能为空") + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + + private String unitName; + + private String unitNo; + + private String ids; + + private Integer roleDataRange; + + private Long[] menuIds; + + + public SysUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + + private Integer isResetPaypass; +} + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java new file mode 100644 index 0000000..7b78b7c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java @@ -0,0 +1,36 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysUserMenu; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 角色和菜单关联业务对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUserMenu.class, reverseConvertGenerate = false) +public class SysUserMenuBo extends BaseEntity { + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空", groups = { EditGroup.class }) + private Long userId; + + /** + * 菜单ID + */ + @NotNull(message = "菜单ID不能为空", groups = { EditGroup.class }) + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java new file mode 100644 index 0000000..9c7cdc0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java @@ -0,0 +1,34 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户密码修改bo + */ +@Data +public class SysUserPasswordBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 旧密码 + */ + @NotBlank(message = "旧密码不能为空") + private String oldPassword; + + /** + * 新密码 + */ + @NotBlank(message = "新密码不能为空") + private String newPassword; + + + //确认密码 + private String surePwd; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java new file mode 100644 index 0000000..501107f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -0,0 +1,66 @@ +package org.dromara.system.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java new file mode 100644 index 0000000..59e0009 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysClientVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java new file mode 100644 index 0000000..852aaec --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 字典数据转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysDictDataVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java new file mode 100644 index 0000000..a36b0ba --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 登录日志转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysLogininforBoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java new file mode 100644 index 0000000..1106bdf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java @@ -0,0 +1,13 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysNoticeVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java new file mode 100644 index 0000000..5f17281 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java @@ -0,0 +1,25 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 操作日志转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysOperLogBoConvert extends BaseMapper { + + /** + * RemoteOperLogBoToSysOperLogBo + * @param remoteOperLogBo 待转换对象 + * @return 转换后对象 + */ + @Mapping(target = "businessTypes", ignore = true) + SysOperLogBo convert(RemoteOperLogBo remoteOperLogBo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java new file mode 100644 index 0000000..97b4c12 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.domain.bo.SysSocialBo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 社交数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSocialBoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java new file mode 100644 index 0000000..2d19ee7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 社交数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSocialVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java new file mode 100644 index 0000000..e1c5cf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 租户转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysTenantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java new file mode 100644 index 0000000..9ff7dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitDomainRemoteConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java new file mode 100644 index 0000000..7eda7d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 单位域名配置Convert接口 + * + * @author LionLi + * @date 2024-03-29 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitDomainVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java new file mode 100644 index 0000000..b0115f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; +import org.mapstruct.factory.Mappers; + +/** + * 用户信息转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUserBoConvert extends BaseMapper { + + /** + * RemoteUserBoToSysUserBo + * @param remoteUserBo 待转换对象 + * @return 转换后对象 + */ + @Mapping(target = "roleIds", ignore = true) + @Mapping(target = "postIds", ignore = true) + SysUserBo convert(RemoteUserBo remoteUserBo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java new file mode 100644 index 0000000..de25bc2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUserRemoteConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java new file mode 100644 index 0000000..79046ff --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java @@ -0,0 +1,24 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户头像信息 + * + * @author Michelle.Chung + */ +@Data +public class AvatarVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 头像地址 + */ + private String imgUrl; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java new file mode 100644 index 0000000..19a6b02 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java @@ -0,0 +1,28 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * 缓存监控列表信息 + * + * @author Michelle.Chung + */ +@Data +public class CacheListInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Properties info; + + private Long dbSize; + + private List> commandStats; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java new file mode 100644 index 0000000..e8d3b34 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java @@ -0,0 +1,31 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class DeptTreeSelectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java new file mode 100644 index 0000000..ad112fa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java @@ -0,0 +1,31 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class MenuTreeSelectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..a7e2549 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 路由显示信息 + * + * @author ruoyi + */ + +@Data +public class MetaVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) { + this.link = link; + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java new file mode 100644 index 0000000..f40cfb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class ProfileVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..824e104 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 路由配置信息 + * + * @author Lion Li + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java new file mode 100644 index 0000000..6a60c66 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysArea; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 区域视图对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysArea.class) +public class SysAreaVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区域id + */ + @ExcelProperty(value = "区域id") + private Long areaId; + + /** + * 区域名 + */ + @ExcelProperty(value = "区域名") + private String areaName; + + /** + * 上级 + */ + @ExcelProperty(value = "上级") + private Long up; + + /** + * 级别 + */ + @ExcelProperty(value = "级别") + private Long level; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 区域code + */ + @ExcelProperty(value = "区域code") + private String code; + + /** + * 1 可用/ 0 不可用 + */ + @ExcelProperty(value = "1 可用/ 0 不可用") + private Integer isUse; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String areaCode; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java new file mode 100644 index 0000000..04d2842 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysClient; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysClient.class) +public class SysClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 客户端id + */ + @ExcelProperty(value = "客户端id") + private String clientId; + + /** + * 客户端key + */ + @ExcelProperty(value = "客户端key") + private String clientKey; + + /** + * 客户端秘钥 + */ + @ExcelProperty(value = "客户端秘钥") + private String clientSecret; + + /** + * 授权类型 + */ + @ExcelProperty(value = "授权类型") + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + @ExcelProperty(value = "token活跃超时时间") + private Long activeTimeout; + + /** + * token固定超时时间 + */ + @ExcelProperty(value = "token固定超时时间") + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java new file mode 100644 index 0000000..946f3df --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysConfig; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysConfig.class) +public class SysConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @ExcelProperty(value = "参数主键") + private Long configId; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @ExcelProperty(value = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @ExcelProperty(value = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java new file mode 100644 index 0000000..a1ba194 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -0,0 +1,96 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDept; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDept.class) +public class SysDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 父部门id + */ + private Long parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人ID + */ + private Long leader; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leaderName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java new file mode 100644 index 0000000..cd84881 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -0,0 +1,88 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictData; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictData.class) +public class SysDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + @ExcelProperty(value = "字典编码") + private Long dictCode; + + /** + * 字典排序 + */ + @ExcelProperty(value = "字典排序") + private Integer dictSort; + + /** + * 字典标签 + */ + @ExcelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @ExcelProperty(value = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isDefault; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java new file mode 100644 index 0000000..1b1f95a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -0,0 +1,57 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysDictType; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictType.class) +public class SysDictTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java new file mode 100644 index 0000000..98c07f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java @@ -0,0 +1,68 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysIndustry; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 行业字典信息视图对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysIndustry.class) +public class SysIndustryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 名称 + */ + @ExcelProperty(value = "名称") + private String name; + + /** + * 父ID + */ + @ExcelProperty(value = "父ID") + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + @ExcelProperty(value = "是否可用 1 是 0 否") + private Integer isUse; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 级别 + */ + @ExcelProperty(value = "级别") + private Integer level; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java new file mode 100644 index 0000000..7ec7047 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -0,0 +1,106 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysLogininfor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 系统访问记录视图对象 sys_logininfor + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysLogininfor.class) +public class SysLogininforVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + @ExcelProperty(value = "序号") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "用户账号") + private String userName; + + /** + * 客户端 + */ + @ExcelProperty(value = "客户端") + private String clientKey; + + /** + * 设备类型 + */ + @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_device_type") + private String deviceType; + + /** + * 登录状态(0成功 1失败) + */ + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private String status; + + /** + * 登录IP地址 + */ + @ExcelProperty(value = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @ExcelProperty(value = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @ExcelProperty(value = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @ExcelProperty(value = "操作系统") + private String os; + + + /** + * 提示消息 + */ + @ExcelProperty(value = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @ExcelProperty(value = "访问时间") + private Date loginTime; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java new file mode 100644 index 0000000..e01ad21 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -0,0 +1,118 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysMenu; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysMenu.class) +public class SysMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建部门 + */ + private Long createDept; + + private String useType; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java new file mode 100644 index 0000000..348a18d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysNotice; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysNotice.class) +public class SysNoticeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + private Integer isRead; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java new file mode 100644 index 0000000..145e11c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysOperLog; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 操作日志记录视图对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysOperLog.class) +public class SysOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @ExcelProperty(value = "日志主键") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + @ExcelProperty(value = "操作模块") + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_oper_type") + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + @ExcelProperty(value = "请求方法") + private String method; + + /** + * 请求方式 + */ + @ExcelProperty(value = "请求方式") + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** + * 操作人员 + */ + @ExcelProperty(value = "操作人员") + private String operName; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 请求URL + */ + @ExcelProperty(value = "请求地址") + private String operUrl; + + /** + * 主机地址 + */ + @ExcelProperty(value = "操作地址") + private String operIp; + + /** + * 操作地点 + */ + @ExcelProperty(value = "操作地点") + private String operLocation; + + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private Integer status; + + /** + * 错误消息 + */ + @ExcelProperty(value = "错误消息") + private String errorMsg; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date operTime; + + /** + * 消耗时间 + */ + @ExcelProperty(value = "消耗时间") + private Long costTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java new file mode 100644 index 0000000..e3ad4cc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -0,0 +1,73 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysPost; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 岗位信息视图对象 sys_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPost.class) +public class SysPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java new file mode 100644 index 0000000..ce8442c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -0,0 +1,100 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysRole; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 角色信息视图对象 sys_role + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysRole.class) +public class SysRoleVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @ExcelProperty(value = "角色序号") + private Long roleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String roleName; + + /** + * 角色权限字符串 + */ + @ExcelProperty(value = "角色权限") + private String roleKey; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "角色排序") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + @ExcelProperty(value = "部门树选择项是否关联显示") + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java new file mode 100644 index 0000000..1c029fe --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysSocial; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 社会化关系视图对象 sys_social + * + * @author thiszhc + */ +@Data +@AutoMapper(target = SysSocial.class) +public class SysSocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + /** + * 显示绑定时间 + */ + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java new file mode 100644 index 0000000..a413d63 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -0,0 +1,66 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenantPackage; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户套餐视图对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenantPackage.class) +public class SysTenantPackageVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @ExcelProperty(value = "租户套餐id") + private Long packageId; + + /** + * 套餐名称 + */ + @ExcelProperty(value = "套餐名称") + private String packageName; + + /** + * 关联菜单id + */ + @ExcelProperty(value = "关联菜单id") + private String menuIds; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java new file mode 100644 index 0000000..90502da --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenant; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenant.class) +public class SysTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 租户编号 + */ + @ExcelProperty(value = "租户编号") + private String tenantId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUserName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactPhone; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String licenseNumber; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String address; + + /** + * 域名 + */ + @ExcelProperty(value = "域名") + private String domain; + + /** + * 企业简介 + */ + @ExcelProperty(value = "企业简介") + private String intro; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户套餐编号 + */ + @ExcelProperty(value = "租户套餐编号") + private Long packageId; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + @ExcelProperty(value = "用户数量") + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java new file mode 100644 index 0000000..5cab4aa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java @@ -0,0 +1,173 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.dromara.system.domain.SysUnitDomain; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnitDomain.class) +public class SysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 域名地址 + */ + @ExcelProperty(value = "域名地址") + private String domainName; + + /** + * 站点名称 + */ + @ExcelProperty(value = "站点名称") + private String websiteName; + + /** + * 客服热线 + */ + @ExcelProperty(value = "客服热线") + private String hotline; + + /** + * 版权信息 + */ + @ExcelProperty(value = "版权信息") + private String copyright; + + /** + * 备案号 + */ + @ExcelProperty(value = "备案号") + private String recordNo; + + /** + * 备案号链接地址 + */ + @ExcelProperty(value = "备案号链接地址") + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @ExcelProperty(value = "PC登录页LOGO") + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @ExcelProperty(value = "PC登录页广告图") + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @ExcelProperty(value = "PC主页LOGO") + private String homePageLogo; + + /** + * 手机端LOGO + */ + @ExcelProperty(value = "手机端LOGO") + private String wapLogo; + + /** + * 手机端广告图 + */ + @ExcelProperty(value = "手机端广告图") + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @ExcelProperty(value = "微信公众号站点名称") + private String weChatPub; + + /** + * 短信配置 + */ + @JsonIgnore + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + @ExcelProperty(value = "PC登录协议") + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @ExcelProperty(value = "手机端用户协议") + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @ExcelProperty(value = "私有协议") + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:禁用") + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)") + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @ExcelProperty(value = "主体id(结算中心id或运营商id或渠道商id或商户id)") + private Long busId; + + /** + * 微信公众号配置 + */ + @JsonIgnore + private String wxPubConfig; + + + @JsonIgnore + private String weChatThirdParams; + + @JsonIgnore + private String weChatDomainName; + + @JsonIgnore + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java new file mode 100644 index 0000000..a1448f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -0,0 +1,99 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.ReverseAutoMapping; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户对象导出VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@AutoMapper(target = SysUserVo.class, convertGenerate = false) +public class SysUserExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String loginIp; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date loginDate; + + /** + * 部门名称 + */ + @ReverseAutoMapping(target = "deptName", source = "dept.deptName") + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 负责人 + */ + @ReverseAutoMapping(target = "leaderName", source = "dept.leaderName") + @ExcelProperty(value = "部门负责人") + private String leaderName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java new file mode 100644 index 0000000..d3ac159 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -0,0 +1,77 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户对象导入VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 +public class SysUserImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门编号") + private Long deptId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java new file mode 100644 index 0000000..2525c89 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -0,0 +1,45 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户信息 + * + * @author Michelle.Chung + */ +@Data +public class SysUserInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 角色ID列表 + */ + private List roleIds; + + /** + * 角色列表 + */ + private List roles; + + /** + * 岗位ID列表 + */ + private List postIds; + + /** + * 岗位列表 + */ + private List posts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java new file mode 100644 index 0000000..d5dfe72 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java @@ -0,0 +1,44 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysUserMenu; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 角色和菜单关联视图对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUserMenu.class) +public class SysUserMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 菜单ID + */ + @ExcelProperty(value = "菜单ID") + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java new file mode 100644 index 0000000..00a65f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -0,0 +1,203 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysUser; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysUser.class) +public class SysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + @Translation(type = TransConstant.OSS_ID_TO_URL) + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 是否登录过(0:否 1:是) + */ + private Integer loginFirst; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 部门对象 + */ + private SysDeptVo dept; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID(作废) + */ + private Integer roleId; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:37 + * 说明:主体编码 + **/ + private String busNo; + + + + + + + private Long curRoleId; + + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + + private Integer isResetPaypass; + + private String unitName; + + private String unitNo; + + private String ids; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java new file mode 100644 index 0000000..0606d26 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Set; + +/** + * 登录用户信息 + * + * @author Michelle.Chung + */ +@Data +public class UserInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户基本信息 + */ + private SysUserVo user; + + /** + * 菜单权限 + */ + private Set permissions; + + /** + * 角色权限 + */ + private Set roles; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java new file mode 100644 index 0000000..b03dce2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.service.ISysClientService; +import org.springframework.stereotype.Service; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteClientServiceImpl implements RemoteClientService { + + private final ISysClientService sysClientService; + + /** + * 根据客户端id获取客户端详情 + */ + @Override + public RemoteClientVo queryByClientId(String clientId) { + SysClientVo vo = sysClientService.queryByClientId(clientId); + return MapstructUtils.convert(vo, RemoteClientVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java new file mode 100644 index 0000000..3fe0edf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java @@ -0,0 +1,49 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUnitDomainService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 配置服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteConfigServiceImpl implements RemoteConfigService { + + private static final Logger log = LoggerFactory.getLogger(RemoteConfigServiceImpl.class); + private final ISysConfigService configService; + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 获取注册开关 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + return configService.selectRegisterEnabled(tenantId); + } + + @Override + public RemoteSysUnitDomainVo queryByDomainName(String domain) { + log.info("查询域名信息"+domain+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + SysUnitDomainVo vo = sysUnitDomainService.queryByDomainName(domain); + log.info("查询域名信息"+vo+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + RemoteSysUnitDomainVo domainVo = MapstructUtils.convert(vo, RemoteSysUnitDomainVo.class); + log.info("查询域名信息"+domainVo+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + domainVo.setWeChatThirdParams(vo.getWeChatThirdParams()); + return vo != null ? domainVo: null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java new file mode 100644 index 0000000..ea59a99 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java @@ -0,0 +1,60 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.system.api.RemoteDataScopeService; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDataScopeServiceImpl implements RemoteDataScopeService { + + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java new file mode 100644 index 0000000..bc9a466 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java @@ -0,0 +1,25 @@ +package org.dromara.system.dubbo; + +import org.dromara.system.api.RemoteDeptService; +import org.dromara.system.service.ISysDeptService; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +/** + * 部门服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDeptServiceImpl implements RemoteDeptService { + + private final ISysDeptService sysDeptService; + + @Override + public String selectDeptNameByIds(String deptIds) { + return sysDeptService.selectDeptNameByIds(deptIds); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java new file mode 100644 index 0000000..10f9dff --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDictServiceImpl implements RemoteDictService { + + private final ISysDictTypeService sysDictTypeService; + + + @Override + public List selectDictDataByType(String dictType) { + List list = sysDictTypeService.selectDictDataByType(dictType); + return MapstructUtils.convert(list, RemoteDictDataVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java new file mode 100644 index 0000000..fd2a69e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java @@ -0,0 +1,39 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteLogService; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.service.ISysLogininforService; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteLogServiceImpl implements RemoteLogService { + + private final ISysOperLogService operLogService; + private final ISysLogininforService logininforService; + + @Override + public void saveLog(RemoteOperLogBo remoteOperLogBo) { + SysOperLogBo sysOperLogBo = MapstructUtils.convert(remoteOperLogBo, SysOperLogBo.class); + operLogService.insertOperlog(sysOperLogBo); + } + + @Override + public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) { + SysLogininforBo sysLogininforBo = MapstructUtils.convert(remoteLogininforBo, SysLogininforBo.class); + logininforService.insertLogininfor(sysLogininforBo); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java new file mode 100644 index 0000000..6c6b24a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteLogService; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.service.ISysLogininforService; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteNoticeServiceImpl implements RemoteNoticeService { + private final SysNoticeMapper noticeMapper; + + @Override + public void addNotice(RemoteSysNoticeVo noticeVo) { + SysNotice add =BeanUtil.copyProperties(noticeVo,SysNotice.class); +// SysNotice add = MapstructUtils.convert(noticeVo,SysNotice.class); + noticeMapper.insert(add); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java new file mode 100644 index 0000000..b2b587c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.system.api.RemoteOrderNumService; +import org.dromara.system.service.IOrderNum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteOrderNumServiceImpl + * @description + * @create 2024-07-16 14:57 + */ + +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteOrderNumServiceImpl implements RemoteOrderNumService { + + + + @Autowired + private IOrderNum orderNum; + + @Override + public Long getOrderNum(String bpmType, int size){ + try{ + return this.orderNum.getOrderLongNum(bpmType,size); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java new file mode 100644 index 0000000..3ddef24 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java @@ -0,0 +1,63 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.mapper.SysSocialMapper; +import org.dromara.system.service.ISysSocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSocialServiceImpl implements RemoteSocialService { + + private final ISysSocialService sysSocialService; + private final SysSocialMapper sysSocialMapper; + + /** + * 根据 authId 查询用户信息 + */ + @Override + public List selectByAuthId(String authId) { + List list = sysSocialService.selectByAuthId(authId); + return MapstructUtils.convert(list, RemoteSocialVo.class); + } + + /** + * 保存社会化关系 + */ + @Override + public void insertByBo(RemoteSocialBo bo) { + sysSocialService.insertByBo(MapstructUtils.convert(bo, SysSocialBo.class)); + } + + /** + * 更新社会化关系 + */ + @Override + public void updateByBo(RemoteSocialBo bo) { + sysSocialService.updateByBo(MapstructUtils.convert(bo, SysSocialBo.class)); + } + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long socialId) { + return sysSocialService.deleteWithValidById(socialId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java new file mode 100644 index 0000000..7dc5839 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java @@ -0,0 +1,43 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zhujie + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteTenantServiceImpl implements RemoteTenantService { + + private final ISysTenantService tenantService; + + /** + * 根据租户id获取租户详情 + */ + @Override + public RemoteTenantVo queryByTenantId(String tenantId) { + SysTenantVo vo = tenantService.queryByTenantId(tenantId); + return MapstructUtils.convert(vo, RemoteTenantVo.class); + } + + /** + * 获取租户列表 + */ + @Override + public List queryList() { + List list = tenantService.queryList(new SysTenantBo()); + return MapstructUtils.convert(list, RemoteTenantVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java new file mode 100644 index 0000000..788ff369 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -0,0 +1,263 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.api.model.RoleDTO; +import org.dromara.system.api.model.XcxLoginUser; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysUserService; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 用户服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserServiceImpl implements RemoteUserService { + + private final ISysUserService userService; + private final ISysPermissionService permissionService; + private final ISysConfigService configService; + private final SysUserMapper userMapper; + + @Override + public LoginUser getUserInfo(String username, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName, SysUser::getStatus) + .eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", username); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", username); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByUserName(username)); + }); + } + + @Override + public LoginUser getUserInfo(Long userId, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName, SysUser::getStatus) + .eq(SysUser::getUserId, userId)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", ""); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", sysUser.getUserName()); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByUserName(sysUser.getUserName())); + }); + } + + @Override + public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getPhonenumber, SysUser::getStatus) + .eq(SysUser::getPhonenumber, phonenumber)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", phonenumber); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", phonenumber); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByPhonenumber(phonenumber)); + }); + } + + @Override + public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getEmail, SysUser::getStatus) + .eq(SysUser::getEmail, email)); + if (ObjectUtil.isNull(user)) { + throw new UserException("user.not.exists", email); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + throw new UserException("user.blocked", email); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByEmail(email)); + }); + } + + @Override + public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException { + // todo 自行实现 userService.selectUserByOpenid(openid); + SysUser sysUser = new SysUser(); + if (ObjectUtil.isNull(sysUser)) { + // todo 用户不存在 业务逻辑自行实现 + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + // todo 用户已被停用 业务逻辑自行实现 + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + XcxLoginUser loginUser = new XcxLoginUser(); + loginUser.setUserId(sysUser.getUserId()); + loginUser.setUsername(sysUser.getUserName()); + loginUser.setNickname(sysUser.getNickName()); + loginUser.setUserType(sysUser.getUserType()); + loginUser.setOpenid(openid); + return loginUser; + } + + @Override + public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException { + SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class); + String username = sysUserBo.getUserName(); + boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { + throw new ServiceException("当前系统没有开启注册功能"); + } + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, sysUserBo.getUserName()) + .ne(ObjectUtil.isNotNull(sysUserBo.getUserId()), SysUser::getUserId, sysUserBo.getUserId())); + }); + if (exist) { + throw new UserException("user.register.save.error", username); + } + return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); + } + + @Override + public String selectUserNameById(Long userId) { + return userService.selectUserNameById(userId); + } + + @Override + public String selectNicknameById(Long userId) { + return userService.selectNicknameById(userId); + } + + /** + * 构建登录用户 + */ + private LoginUser buildLoginUser(SysUserVo userVo) { + LoginUser loginUser = new LoginUser(); + loginUser.setTenantId(userVo.getTenantId()); + loginUser.setUserId(userVo.getUserId()); + loginUser.setDeptId(userVo.getDeptId()); + loginUser.setUsername(userVo.getUserName()); + loginUser.setNickname(userVo.getNickName()); + loginUser.setPassword(userVo.getPassword()); + loginUser.setUserType(userVo.getUserType()); + loginUser.setPhonenumber(userVo.getPhonenumber()); + loginUser.setCurRoleId(userVo.getCurRoleId()); + loginUser.setCurRoleName(userVo.getCurRoleName()); + loginUser.setRoleDataRange(userVo.getRoleDataRange()); + loginUser.setBusId(userVo.getBusId()); + loginUser.setBusNo(userVo.getBusNo()); + loginUser.setBusRole(userVo.getCurRoleId() != null ? userVo.getCurRoleId().intValue() : null); + loginUser.setIds(userVo.getIds()); + loginUser.setBindOpenId(userVo.getBindOpenId()); + loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId())); + loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId())); + loginUser.setDeptName(ObjectUtil.isNull(userVo.getDept()) ? "" : userVo.getDept().getDeptName()); + List roles = BeanUtil.copyToList(userVo.getRoles(), RoleDTO.class); + loginUser.setRoles(roles); + return loginUser; + } + + /** + * 更新用户信息 + * + * @param userId 用户ID + * @param ip IP地址 + */ + @Override + public void recordLoginInfo(Long userId, String ip) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(ip); + sysUser.setLoginDate(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId); + DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); + } + + @Override + public int insertBusUser(RemoteUserBo userBo) { + + SysUser sysUser = new SysUser(); + sysUser.setUserName(userBo.getUserName()); + sysUser.setRoleId(userBo.getRoleId()); + sysUser.setNickName(userBo.getNickName()); + sysUser.setUserType(userBo.getUserType()); + sysUser.setBusNo(userBo.getBusNo()); + sysUser.setBusId(userBo.getBusId()); + sysUser.setRoleId(userBo.getRoleId()); + sysUser.setCurRoleName(userBo.getRoleName()); + sysUser.setPhonenumber(userBo.getPhonenumber()); + sysUser.setPassword(userBo.getPassword()); + sysUser.setStatus("0"); + sysUser.setDelFlag("0"); + sysUser.setCreateBy(userBo.getCreateBy()); + sysUser.setCreateTime(userBo.getCreateTime()); + return this.userService.insertBusUser(sysUser); + } + + @Override + public int updateUserResetPayTag(Long userId) { + SysUser sysUserBo = new SysUser(); + sysUserBo.setUserId(userId); + sysUserBo.setIsResetPaypass(1); + sysUserBo.setUpdateTime(new Date()); + sysUserBo.setUpdateBy(userId); + return this.userService.updateUserInfos(sysUserBo); + } + + @Override + public RemoteSysUserVo selectUserByName(String userName) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getStatus, 0) + .eq(SysUser::getDelFlag, 0) + .eq(SysUser::getUserName, userName)); + return sysUser != null ? MapstructUtils.convert(sysUser, RemoteSysUserVo.class) : null; + } + + @Override + public RemoteSysUserVo selectUserById(long userId) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getStatus, 0) + .eq(SysUser::getDelFlag, 0) + .eq(SysUser::getUserId, userId)); + return sysUser != null ? MapstructUtils.convert(sysUser, RemoteSysUserVo.class) : null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java new file mode 100644 index 0000000..9cd144d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -0,0 +1,119 @@ +package org.dromara.system.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { + + private final ISysUserService userService; + + private final String password; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public SysUserImportListener(Boolean isUpdateSupport) { + String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); + this.userService = SpringUtils.getBean(ISysUserService.class); + this.password = BCrypt.hashpw(initPassword); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(SysUserImportVo userVo, AnalysisContext context) { + SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(sysUser)) { + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + ValidatorUtils.validate(user); + user.setPassword(password); + user.setCreateBy(operUserId); + userService.insertUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long userId = sysUser.getUserId(); + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + user.setUserId(userId); + ValidatorUtils.validate(user); + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(operUserId); + userService.updateUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + userVo.getUserName() + " 导入失败:"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java new file mode 100644 index 0000000..f8e3237 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java @@ -0,0 +1,29 @@ +package org.dromara.system.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.system.domain.BpmOrderNum; + +import java.util.List; +import java.util.Map; + +/** + * 公共接口服务接口 + * + * @author wuchuang + * @since 2023-12-04 17:44:28 + */ +public interface CommonMapper { + + + + + public int insertIntoOrderNum(BpmOrderNum orderNum); + + + public int updateOrderNumByProName(BpmOrderNum orderNum); + + + public BpmOrderNum selectOrderNumByBpmDefInfo(BpmOrderNum orderNum); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java new file mode 100644 index 0000000..f3f0dcc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysArea; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 区域Mapper接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface SysAreaMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java new file mode 100644 index 0000000..a8943de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; + +/** + * 授权管理Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysClientMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..0eaaee8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.vo.SysConfigVo; + +/** + * 参数配置 数据层 + * + * @author Lion Li + */ +public interface SysConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..45ad77e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -0,0 +1,46 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.vo.SysDeptVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author Lion Li + */ +public interface SysDeptMapper extends BaseMapperPlus { + + /** + * 查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + SysDeptVo selectDeptById(Long deptId); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..c2f1a7c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -0,0 +1,23 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictDataMapper extends BaseMapperPlus { + + default List selectDictDataByType(String dictType) { + return selectVoList( + new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType) + .orderByAsc(SysDictData::getDictSort)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..9a9bdd5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysDictType; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysDictTypeVo; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java new file mode 100644 index 0000000..6a3da3a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 行业字典信息Mapper接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface SysIndustryMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..85edd1d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.vo.SysLogininforVo; + +/** + * 系统访问日志情况信息 数据层 + * + * @author Lion Li + */ +public interface SysLogininforMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..6cad9de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -0,0 +1,94 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.system.domain.SysMenu; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysMenuVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author Lion Li + */ +public interface SysMenuMapper extends BaseMapperPlus { + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param queryWrapper 查询条件 + * @return 菜单列表 + */ + List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + List selectMenuListByUserIdNew(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + default List selectMenuTreeAll() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .in(SysMenu::getMenuType, UserConstants.TYPE_DIR, UserConstants.TYPE_MENU) + .eq(SysMenu::getStatus, UserConstants.MENU_NORMAL) + .apply("FIND_IN_SET({0}, use_type) > 0", BusRole.PLATFORM.getId()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum); + return this.selectList(lqw); + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + List selectMenuTreeByUserIdNew(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + + List selectOperMenuListByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..ef49a32 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -0,0 +1,30 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +/** + * 通知公告表 数据层 + * + * @author Lion Li + */ +public interface SysNoticeMapper extends BaseMapperPlus { + + Page selectPageNoticeListByUser(@Param("page") Page build, + @Param("ew") QueryWrapper lqw, + @Param("userId") Long userId); + + + int selectNoticeReadByUser(@Param("userId") Long userId, @Param("noticeId") Long noticeId); + + void insertNoticeRead(@Param("userId") Long userId, @Param("noticeId") Long noticeId); + + void insertNoticeRole(@Param("noticeId") Long noticeId, @Param("busRoles") Integer[] busRoles); + + void deleteNoticeRole(@Param("noticeId") Long noticeId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..5d20404 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.vo.SysOperLogVo; + +/** + * 操作日志 数据层 + * + * @author Lion Li + */ +public interface SysOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..48e6a12 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -0,0 +1,32 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author Lion Li + */ +public interface SysPostMapper extends BaseMapperPlus { + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + List selectPostsByUserName(String userName); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..3de0bb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleDeptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..55ca769 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -0,0 +1,71 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.vo.SysRoleVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询角色数据 + * + * @param queryWrapper 查询条件 + * @return 角色数据集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + SysRoleVo selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolePermissionByUserId(Long userId); + + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + List selectRolesByUserName(String userName); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..0a657b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java new file mode 100644 index 0000000..b942061 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.vo.SysSocialVo; + +/** + * 社会化关系Mapper接口 + * + * @author thiszhc + */ +public interface SysSocialMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java new file mode 100644 index 0000000..7e1167a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java new file mode 100644 index 0000000..10ca170 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantPackageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java new file mode 100644 index 0000000..16e4b27 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位域名配置Mapper接口 + * + * @author LionLi + * @date 2024-03-29 + */ +public interface SysUnitDomainMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..773a4d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -0,0 +1,130 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author Lion Li + */ +public interface SysUserMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询用户列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过邮箱查询用户 + * + * @param email 邮箱 + * @return 用户对象信息 + */ + SysUserVo selectUserByEmail(String email); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + SysUserVo selectUserById(Long userId); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int update(@Param(Constants.ENTITY) SysUser user, @Param(Constants.WRAPPER) Wrapper updateWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) SysUser user); + + + /*** + * 子操作员管理 + * @param page + * @param queryWrapper + * @return + */ + Page selNewUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /*** + * 更新用户绑定openid + * @param user + * @return + */ + int updateBindUserOpenid(SysUser user); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java new file mode 100644 index 0000000..31eabe0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysUserMenu; +import org.dromara.system.domain.vo.SysUserMenuVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 角色和菜单关联Mapper接口 + * + * @author LionLi + * @date 2024-04-30 + */ +public interface SysUserMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..07c1371 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserPostMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..e2f706c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,17 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserRole; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserRoleMapper extends BaseMapperPlus { + + List selectUserIdsByRoleId(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java new file mode 100644 index 0000000..65511ca --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java @@ -0,0 +1,16 @@ +package org.dromara.system.service; + +/****************** + * + * 流程工单号生成接口 + * + * @author Administrator + */ +public interface IOrderNum { + + public String getOrderNum(String bpmType,int size ) throws Exception; + + + + public Long getOrderLongNum(String bpmType,int size )throws Exception; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java new file mode 100644 index 0000000..02e73f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java @@ -0,0 +1,55 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SysArea; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 区域Service接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface ISysAreaService { + + + + + + /** + * 查询区域 + */ + SysAreaVo queryById(Long areaId); + + /** + * 查询区域列表 + */ + TableDataInfo queryPageList(SysAreaBo bo, PageQuery pageQuery); + + + + /** + * 查询区域列表 + */ + List queryList(SysAreaBo bo); + + /** + * 新增区域 + */ + Boolean insertByBo(SysAreaBo bo); + + /** + * 修改区域 + */ + Boolean updateByBo(SysAreaBo bo); + + /** + * 校验并批量删除区域信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java new file mode 100644 index 0000000..4382844 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -0,0 +1,58 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service接口 + * + * @author Michelle.Chung + */ +public interface ISysClientService { + + /** + * 查询客户端管理 + */ + SysClientVo queryById(Long id); + + /** + * 查询客户端信息基于客户端id + */ + SysClientVo queryByClientId(String clientId); + + /** + * 查询客户端管理列表 + */ + TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery); + + /** + * 查询客户端管理列表 + */ + List queryList(SysClientBo bo); + + /** + * 新增客户端管理 + */ + Boolean insertByBo(SysClientBo bo); + + /** + * 修改客户端管理 + */ + Boolean updateByBo(SysClientBo bo); + + /** + * 修改状态 + */ + int updateUserStatus(Long id, String status); + + /** + * 校验并批量删除客户端管理信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java new file mode 100644 index 0000000..f7efda7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -0,0 +1,87 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author Lion Li + */ +public interface ISysConfigService { + + + TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + SysConfigVo selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + String selectConfigByKey(String configKey); + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + List selectConfigList(SysConfigBo config); + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String insertConfig(SysConfigBo bo); + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String updateConfig(SysConfigBo bo); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + void deleteConfigByIds(Long[] configIds); + + /** + * 重置参数缓存数据 + */ + void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + boolean checkConfigKeyUnique(SysConfigBo config); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java new file mode 100644 index 0000000..3625486 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -0,0 +1,125 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author Lion Li + */ +public interface ISysDeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDeptBo dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(SysDeptBo dept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDeptVo selectDeptById(Long deptId); + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + long selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + boolean checkDeptNameUnique(SysDeptBo dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int insertDept(SysDeptBo bo); + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int updateDept(SysDeptBo bo); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java new file mode 100644 index 0000000..30442ce --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -0,0 +1,67 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictDataService { + + + TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery); + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + List selectDictDataList(SysDictDataBo dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + SysDictDataVo selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List insertDictData(SysDictDataBo bo); + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List updateDictData(SysDictDataBo bo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..3b32d6c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -0,0 +1,95 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictTypeService { + + + TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + List selectDictTypeList(SysDictTypeBo dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List insertDictType(SysDictTypeBo bo); + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List updateDictType(SysDictTypeBo bo); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + boolean checkDictTypeUnique(SysDictTypeBo dictType); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java new file mode 100644 index 0000000..a0dd507 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java @@ -0,0 +1,62 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 行业字典信息Service接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface ISysIndustryService { + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-19 13:39 + * 说明:查询所有行业 + **/ + + List selectIndustryList(); + + /** + * 查询行业字典信息 + */ + SysIndustryVo queryById(Long id); + + /** + * 查询行业字典信息列表 + */ + TableDataInfo queryPageList(SysIndustryBo bo, PageQuery pageQuery); + + /** + * 查询行业字典信息列表 + */ + List queryList(SysIndustryBo bo); + + /** + * 新增行业字典信息 + */ + Boolean insertByBo(SysIndustryBo bo); + + /** + * 修改行业字典信息 + */ + Boolean updateByBo(SysIndustryBo bo); + + /** + * 校验并批量删除行业字典信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java new file mode 100644 index 0000000..6b3b7a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -0,0 +1,47 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author Lion Li + */ +public interface ISysLogininforService { + + + TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + void insertLogininfor(SysLogininforBo bo); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + List selectLogininforList(SysLogininforBo logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + void cleanLogininfor(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java new file mode 100644 index 0000000..8a3f257 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -0,0 +1,169 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author Lion Li + */ +public interface ISysMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @param useType 菜单的使用类型 + * @return 菜单列表 + */ + List selectMenuList(Long userId,Long useType); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysMenuBo menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @param roleDataRange 权限范围(1:角色 2:个人) + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId,Integer roleDataRange); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysMenuVo selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int insertMenu(SysMenuBo bo); + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int updateMenu(SysMenuBo bo); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + boolean checkMenuNameUnique(SysMenuBo menu); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-30 16:24 + * 说明:查询当前用户的菜单权限 + **/ + + List selectCurrentUserMenuList(SysMenuBo menu, Long userId); + + + /*** + * 查询操作员已经分配的菜单列表 + * @param userId + * @return + */ + List selectMenuListByUserId(Long userId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java new file mode 100644 index 0000000..f6b23ed --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -0,0 +1,69 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author Lion Li + */ +public interface ISysNoticeService { + + + TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + SysNoticeVo selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + List selectNoticeList(SysNoticeBo notice); + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int insertNotice(SysNoticeBo bo); + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int updateNotice(SysNoticeBo bo); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + int deleteNoticeByIds(Long[] noticeIds); + + TableDataInfo selectPageNoticeListByUser(SysNoticeBo notice, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java new file mode 100644 index 0000000..9573510 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -0,0 +1,54 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author Lion Li + */ +public interface ISysOperLogService { + + TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + void insertOperlog(SysOperLogBo bo); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + List selectOperLogList(SysOperLogBo operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + SysOperLogVo selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + void cleanOperLog(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java new file mode 100644 index 0000000..0116df5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -0,0 +1,28 @@ +package org.dromara.system.service; + +import java.util.Set; + +/** + * 用户权限处理 + * + * @author Lion Li + */ +public interface ISysPermissionService { + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + Set getRolePermission(Long userId); + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + Set getMenuPermission(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java new file mode 100644 index 0000000..c6409c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -0,0 +1,106 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author Lion Li + */ +public interface ISysPostService { + + + TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + List selectPostList(SysPostBo post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + SysPostVo selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostNameUnique(SysPostBo post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostCodeUnique(SysPostBo post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + long countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int insertPost(SysPostBo bo); + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int updatePost(SysPostBo bo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java new file mode 100644 index 0000000..d2ee61f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -0,0 +1,183 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author Lion Li + */ +public interface ISysRoleService { + + + TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleBo role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + SysRoleVo selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleNameUnique(SysRoleBo role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleKeyUnique(SysRoleBo role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(SysRoleBo role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int insertRole(SysRoleBo bo); + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int updateRole(SysRoleBo bo); + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + int updateRoleStatus(Long roleId, String status); + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int authDataScope(SysRoleBo bo); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); + + void cleanOnlineUserByRole(Long roleId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java new file mode 100644 index 0000000..0950b60 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java @@ -0,0 +1,56 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; + +import java.util.List; + +/** + * 社会化关系Service接口 + * + * @author thiszhc + */ +public interface ISysSocialService { + + + /** + * 查询社会化关系 + */ + SysSocialVo queryById(String id); + + /** + * 查询社会化关系列表 + */ + List queryList(); + + /** + * 查询社会化关系列表 + */ + List queryListByUserId(Long userId); + + /** + * 新增授权关系 + */ + Boolean insertByBo(SysSocialBo bo); + + /** + * 更新社会化关系 + */ + + Boolean updateByBo(SysSocialBo bo); + + /** + * 删除社会化关系信息 + */ + Boolean deleteWithValidById(Long id); + + + /** + * 根据 authId 查询 SysSocial 表和 SysUser 表,返回 SysSocialAuthResult 映射的对象 + * @param authId 认证ID + * @return SysSocial + */ + List selectByAuthId(String authId); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java new file mode 100644 index 0000000..cdb887c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -0,0 +1,57 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantPackageService { + + /** + * 查询租户套餐 + */ + SysTenantPackageVo queryById(Long packageId); + + /** + * 查询租户套餐列表 + */ + TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery); + + /** + * 查询租户套餐已启用列表 + */ + List selectList(); + + /** + * 查询租户套餐列表 + */ + List queryList(SysTenantPackageBo bo); + + /** + * 新增租户套餐 + */ + Boolean insertByBo(SysTenantPackageBo bo); + + /** + * 修改租户套餐 + */ + Boolean updateByBo(SysTenantPackageBo bo); + + /** + * 修改套餐状态 + */ + int updatePackageStatus(SysTenantPackageBo bo); + + /** + * 校验并批量删除租户套餐信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java new file mode 100644 index 0000000..d12ed95 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -0,0 +1,82 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantService { + + /** + * 查询租户 + */ + SysTenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + SysTenantVo queryByTenantId(String tenantId); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(SysTenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(SysTenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(SysTenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(SysTenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(SysTenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, Long packageId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java new file mode 100644 index 0000000..ea46e71 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java @@ -0,0 +1,58 @@ +package org.dromara.system.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 单位域名配置Service接口 + * + * @author LionLi + * @date 2024-03-29 + */ +public interface ISysUnitDomainService { + + /** + * 查询单位域名配置 + */ + SysUnitDomainVo queryById(Long id); + + /** + * 根据域名获取站点配置信息 + * @param domain 域名 + * @return + */ + public SysUnitDomainVo queryByDomainName(String domain); + + /** + * 查询单位域名配置列表 + */ + TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery); + + /** + * 查询单位域名配置列表 + */ + List queryList(SysUnitDomainBo bo); + + /** + * 新增单位域名配置 + */ + Boolean insertByBo(SysUnitDomainBo bo); + + /** + * 修改单位域名配置 + */ + Boolean updateByBo(SysUnitDomainBo bo); + + /** + * 校验并批量删除单位域名配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java new file mode 100644 index 0000000..31d5724 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -0,0 +1,313 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author Lion Li + */ +public interface ISysUserService { + + + TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + List selectUserList(SysUserBo user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUserVo selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkUserNameUnique(SysUserBo user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkPhoneUnique(SysUserBo user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkEmailUnique(SysUserBo user); + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + void checkUserAllowed(Long userId); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int insertUser(SysUserBo user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + boolean registerUser(SysUserBo user, String tenantId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUser(SysUserBo user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserNew(SysUserBo user); + + + + int updateUserInfos(SysUser sysUser); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + int updateUserStatus(Long userId, String status); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserProfile(SysUserBo user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + boolean updateUserAvatar(Long userId, Long avatar); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(Long userId, String password); + + + + /** + * 重置用户密码 + * @param srcPwd 用户ID + * @param newPwd 密码 + * @param newPwd 确认密码 + * @return 结果 + */ + int resetMyPwd(String srcPwd,String newPwd,String surePwd); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectNicknameById(Long userId); + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId + * @return + */ + List selectUserListByDept(Long deptId); + + + /*** + * 操作员查询 + * @param user + * @param pageQuery + * @return + */ + TableDataInfo selNewUserList(SysUserBo user, PageQuery pageQuery); + + + /*** + * 添加操作员 + * @param user + * @return + */ + int insertUserNew(SysUserBo user); + + /*** + * 操作员分配权限 + * @param user + * @return + */ + Boolean configUserPer(SysUserBo user); + + /*** + * 修改登录方式 + * @param userId + * @param loginType + * @return + */ + int updLoginWay(Long userId, Integer loginType); + + + /*** + * 查询登录方式 + * @param userId + * @return + */ + Integer selLoginWay(Long userId); + + + + /*** + * 添加业务管理员 + * @param sysUser + * @return + */ + int insertBusUser(SysUser sysUser); + + + public String getBindingQr(String domain); + + public Boolean bindWeixinOpenId(String domain,String code,String username); + + + /*** + * 更新管理员已读协议标识 + * @return + */ + String updateReadProTag(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java new file mode 100644 index 0000000..9fe3e15 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java @@ -0,0 +1,97 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.date.DateUtil; +import org.dromara.system.domain.BpmOrderNum; +import org.dromara.system.mapper.CommonMapper; +import org.dromara.system.service.IOrderNum; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title BpmOrderNumImpl + * @description + * @create 2024-02-20 18:17 + */ + +@Service +public class BpmOrderNumImpl implements IOrderNum { + + private Map cacheMap = Collections.synchronizedMap(new HashMap<>()); + + @Resource + private CommonMapper commonMapper; + + private static String PRI = "NUM_"; + @Override + public synchronized String getOrderNum(String bpmType,int size ) throws Exception { + + String date = DateUtil.format(new Date(), DateTimeFormatter.ofPattern("yyyyMMdd")); + Long num = cacheMap.get(PRI+bpmType+"_"+date); + BpmOrderNum orderNum = new BpmOrderNum(); + orderNum.setV_process_name(bpmType); + orderNum.setDtm_time(date); + + if(num == null){ + BpmOrderNum resultOrder = this.commonMapper.selectOrderNumByBpmDefInfo(orderNum); + if(resultOrder == null){ + orderNum.setI_max_num(1L); + this.commonMapper.insertIntoOrderNum(orderNum); + cacheMap.put(PRI+bpmType+"_"+date,1L); + }else{ + long i = resultOrder.getI_max_num()+1; + this.getNextNumber(orderNum,i); + } + }else{ + num += 1; + this.getNextNumber(orderNum,num); + } + + return String.format("%0" + size + "d", orderNum.getI_max_num()); + } + + + @Override + public synchronized Long getOrderLongNum(String bpmType,int size ) throws Exception { + +// String date = DateUtil.format(new Date(), DateTimeFormatter.ofPattern("yyyyMMdd")); + String date = "20240816"; + Long num = cacheMap.get(PRI+bpmType+"_"+date); + BpmOrderNum orderNum = new BpmOrderNum(); + orderNum.setV_process_name(bpmType); + orderNum.setDtm_time(date); + + if(num == null){ + BpmOrderNum resultOrder = this.commonMapper.selectOrderNumByBpmDefInfo(orderNum); + if(resultOrder == null){ + orderNum.setI_max_num(1L); + this.commonMapper.insertIntoOrderNum(orderNum); + cacheMap.put(PRI+bpmType+"_"+date,1L); + }else{ + long i = resultOrder.getI_max_num()+1; + this.getNextNumber(orderNum,i); + } + }else{ + num += 1; + this.getNextNumber(orderNum,num); + } + + return orderNum.getI_max_num(); + } + + + private void getNextNumber(BpmOrderNum orderNum, long i) throws Exception { + + this.cacheMap.put(PRI+orderNum.getV_process_name()+"_"+orderNum.getDtm_time(), i); + orderNum.setI_max_num(i); + this.commonMapper.updateOrderNumByProName(orderNum); + } +} + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java new file mode 100644 index 0000000..3e29a3f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.SysArea; +import org.dromara.system.mapper.SysAreaMapper; +import org.dromara.system.service.ISysAreaService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 区域Service业务层处理 + * + * @author LionLi + * @date 2024-04-18 + */ +@RequiredArgsConstructor +@Service +public class SysAreaServiceImpl implements ISysAreaService { + + private final SysAreaMapper baseMapper; + + /** + * 查询区域 + */ + @Override + public SysAreaVo queryById(Long areaId){ + return baseMapper.selectVoById(areaId); + } + + /** + * 查询区域列表 + */ + @Override + public TableDataInfo queryPageList(SysAreaBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询区域列表 + */ + @Override + public List queryList(SysAreaBo bo) { + bo.setIsUse(1); + QueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByAsc("sort"); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(SysAreaBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.like(StringUtils.isNotBlank(bo.getAreaName()), "area_name", bo.getAreaName()); + lqw.eq(bo.getUp() != null, "up", bo.getUp()); + lqw.eq(bo.getLevel() != null, "level", bo.getLevel()); + lqw.eq(bo.getSort() != null, "sort", bo.getSort()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), "code", bo.getCode()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + lqw.eq(StringUtils.isNotBlank(bo.getAreaCode()), "area_code", bo.getAreaCode()); + return lqw; + } + + /** + * 新增区域 + */ + @Override + public Boolean insertByBo(SysAreaBo bo) { + SysArea add = MapstructUtils.convert(bo, SysArea.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setAreaId(add.getAreaId()); + } + return flag; + } + + /** + * 修改区域 + */ + @Override + public Boolean updateByBo(SysAreaBo bo) { + SysArea update = MapstructUtils.convert(bo, SysArea.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysArea entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除区域 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java new file mode 100644 index 0000000..9ed56af --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -0,0 +1,143 @@ +package org.dromara.system.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.mapper.SysClientMapper; +import org.dromara.system.service.ISysClientService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service业务层处理 + * + * @author Michelle.Chung + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysClientServiceImpl implements ISysClientService { + + private final SysClientMapper baseMapper; + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryById(Long id) { + SysClientVo vo = baseMapper.selectVoById(id); + vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + return vo; + } + + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryByClientId(String clientId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); + } + + /** + * 查询客户端管理列表 + */ + @Override + public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + return TableDataInfo.build(result); + } + + /** + * 查询客户端管理列表 + */ + @Override + public List queryList(SysClientBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysClientBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getClientId()), SysClient::getClientId, bo.getClientId()); + lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), SysClient::getClientKey, bo.getClientKey()); + lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), SysClient::getClientSecret, bo.getClientSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysClient::getStatus, bo.getStatus()); + lqw.orderByAsc(SysClient::getId); + return lqw; + } + + /** + * 新增客户端管理 + */ + @Override + public Boolean insertByBo(SysClientBo bo) { + SysClient add = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(add); + add.setGrantType(String.join(",", bo.getGrantTypeList())); + // 生成clientid + String clientKey = bo.getClientKey(); + String clientSecret = bo.getClientSecret(); + add.setClientId(SecureUtil.md5(clientKey + clientSecret)); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户端管理 + */ + @Override + public Boolean updateByBo(SysClientBo bo) { + SysClient update = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(update); + update.setGrantType(String.join(",", bo.getGrantTypeList())); + return baseMapper.updateById(update) > 0; + } + + /** + * 修改状态 + */ + @Override + public int updateUserStatus(Long id, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysClient::getStatus, status) + .eq(SysClient::getId, id)); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysClient entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除客户端管理 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..7f72159 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,205 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.mapper.SysConfigMapper; +import org.dromara.system.service.ISysConfigService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数配置 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysConfigServiceImpl implements ISysConfigService { + + private final SysConfigMapper baseMapper; + + @Override + public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DS("master") + public SysConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") + @Override + public String selectConfigByKey(String configKey) { + SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, configKey)); + if (ObjectUtil.isNotNull(retConfig)) { + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, "sys.account.registerUser")); + }); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysConfig::getConfigId); + return lqw; + } + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String insertConfig(SysConfigBo bo) { + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + int row = baseMapper.insert(config); + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String updateConfig(SysConfigBo bo) { + int row = 0; + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + if (config.getConfigId() != null) { + SysConfig temp = baseMapper.selectById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { + CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); + } + row = baseMapper.updateById(config); + } else { + row = baseMapper.update(config, new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey())); + } + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + SysConfig config = baseMapper.selectById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + } + baseMapper.deleteBatchIds(Arrays.asList(configIds)); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + CacheUtils.clear(CacheNames.SYS_CONFIG); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfigBo config) { + long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { + return false; + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..44383a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,326 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysDeptService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 部门管理 服务实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDeptServiceImpl implements ISysDeptService{ + + private final SysDeptMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysUserMapper userMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + public List selectDeptList(SysDeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); + return baseMapper.selectDeptList(lqw); + } + + /** + * 查询部门树结构信息 + * + * @param bo 部门信息 + * @return 部门树信息集合 + */ + @Override + public List> selectDeptTreeList(SysDeptBo bo) { + // 只查询未禁用部门 + bo.setStatus(UserConstants.DEPT_NORMAL); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List depts = baseMapper.selectDeptList(lqw); + return buildDeptTreeSelect(depts); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysDept::getDelFlag, "0"); + lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); + lqw.orderByAsc(SysDept::getParentId); + lqw.orderByAsc(SysDept::getOrderNum); + lqw.orderByAsc(SysDept::getDeptId); + return lqw; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildDeptTreeSelect(List depts) { + if (CollUtil.isEmpty(depts)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(depts, (dept, tree) -> + tree.setId(dept.getDeptId()) + .setParentId(dept.getParentId()) + .setName(dept.getDeptName()) + .setWeight(dept.getOrderNum())); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public SysDeptVo selectDeptById(Long deptId) { + SysDeptVo dept = baseMapper.selectVoById(deptId); + if (ObjectUtil.isNull(dept)) { + return null; + } + SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() + .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); + dept.setParentName(ObjectUtil.isNotNull(parentDept) ? parentDept.getDeptName() : null); + return dept; + } + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + public String selectDeptNameByIds(String deptIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { + SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); + if (ObjectUtil.isNotNull(vo)) { + list.add(vo.getDeptName()); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public long selectNormalChildrenDeptById(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(SysDept::getStatus, UserConstants.DEPT_NORMAL) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + return baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getParentId, deptId)); + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getDeptId, deptId)); + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDeptBo dept) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getDeptName, dept.getDeptName()) + .eq(SysDept::getParentId, dept.getParentId()) + .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId())); + return !exist; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + SysDeptVo dept = baseMapper.selectDeptById(deptId); + if (ObjectUtil.isNull(dept)) { + throw new ServiceException("没有权限访问部门数据!"); + } + } + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDeptBo bo) { + SysDept info = baseMapper.selectById(bo.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new ServiceException("部门停用,不允许新增"); + } + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); + return baseMapper.insert(dept); + } + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId") + @Override + public int updateDept(SysDeptBo bo) { + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + SysDept oldDept = baseMapper.selectById(dept.getDeptId()); + if (!oldDept.getParentId().equals(dept.getParentId())) { + // 如果是新父部门 则校验是否具有新父部门权限 避免越权 + this.checkDeptDataScope(dept.getParentId()); + SysDept newParentDept = baseMapper.selectById(dept.getParentId()); + if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + } + int result = baseMapper.updateById(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals(UserConstants.DEPT_NORMAL, dept.getAncestors())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysDept::getStatus, UserConstants.DEPT_NORMAL) + .in(SysDept::getDeptId, Arrays.asList(deptIds))); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List list = new ArrayList<>(); + for (SysDept child : children) { + SysDept dept = new SysDept(); + dept.setDeptId(child.getDeptId()); + dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(dept); + } + if (CollUtil.isNotEmpty(list)) { + if (baseMapper.updateBatchById(list)) { + list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); + } + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public int deleteDeptById(Long deptId) { + return baseMapper.deleteById(deptId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..c0a62c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,138 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.service.ISysDictDataService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + + private final SysDictDataMapper baseMapper; + + @Override + public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); + lqw.orderByAsc(SysDictData::getDictSort); + return lqw; + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysDictData::getDictLabel) + .eq(SysDictData::getDictType, dictType) + .eq(SysDictData::getDictValue, dictValue)) + .getDictLabel(); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = baseMapper.selectById(dictCode); + baseMapper.deleteById(dictCode); + CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); + } + } + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.insert(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List updateDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.updateById(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..8f958e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,206 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysDictTypeMapper; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService { + + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; + + @Override + public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysDictType::getDictId); + return lqw; + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return baseMapper.selectVoList(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = baseMapper.selectById(dictId); + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType.getDictType()))) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + } + baseMapper.deleteBatchIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + CacheUtils.clear(CacheNames.SYS_DICT); + } + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + int row = baseMapper.insert(dict); + if (row > 0) { + // 新增 type 下无 data 数据 返回空防止缓存穿透 + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + SysDictType oldDict = baseMapper.selectById(dict.getDictId()); + dictDataMapper.update(null, new LambdaUpdateWrapper() + .set(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + return dictDataMapper.selectDictDataByType(dict.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictTypeBo dictType) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); + return !exist; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java new file mode 100644 index 0000000..04029b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java @@ -0,0 +1,155 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.mapper.SysIndustryMapper; +import org.dromara.system.service.ISysIndustryService; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 行业字典信息Service业务层处理 + * + * @author LionLi + * @date 2024-04-18 + */ +@RequiredArgsConstructor +@Service +public class SysIndustryServiceImpl implements ISysIndustryService { + + private final SysIndustryMapper baseMapper; + + @Override + public List selectIndustryList() { + List list = new ArrayList(); + SysIndustryBo bo = new SysIndustryBo(); + bo.setIsUse(1); + List voList = this.baseMapper.selectVoList(this.buildQueryWrapper(bo)); + voList.forEach(vo -> { + if(vo.getParentId().equals(0L) && vo.getLevel().equals(1)){ + Map map = new TreeMap(); + map.put("value",vo.getId()); + map.put("label",vo.getName()); + list.add(map); + }else{ + Map map = getSubMap(vo.getParentId(),list); + + List subList = (List)map.get("children"); + if(subList == null){ + subList = new ArrayList(); + map.put("children",subList); + } + + Map submap = new HashMap(); + submap.put("value",vo.getId()); + submap.put("label",vo.getName()); + subList.add(submap); + } + }); + return list; + } + + private Map getSubMap(Long id, List list) { + for(Map m : list){ + Object v = m.get("value"); + if(v != null && id.equals(v)){ + return m; + } + } + return null; + } + + /** + * 查询行业字典信息 + */ + @Override + public SysIndustryVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询行业字典信息列表 + */ + @Override + public TableDataInfo queryPageList(SysIndustryBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询行业字典信息列表 + */ + @Override + public List queryList(SysIndustryBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(SysIndustryBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + + lqw.eq(bo.getParentId() != null, "parent_id", bo.getParentId()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + lqw.eq(bo.getSort() != null, "i_sort", bo.getSort()); + lqw.eq(bo.getLevel() != null, "i_level", bo.getLevel()); + lqw.orderByAsc("parent_id","sort"); + return lqw; + } + + /** + * 新增行业字典信息 + */ + @Override + public Boolean insertByBo(SysIndustryBo bo) { + SysIndustry add = MapstructUtils.convert(bo, SysIndustry.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改行业字典信息 + */ + @Override + public Boolean updateByBo(SysIndustryBo bo) { + SysIndustry update = MapstructUtils.convert(bo, SysIndustry.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysIndustry entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除行业字典信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..ebea956 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,108 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.mapper.SysLogininforMapper; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLogininforServiceImpl implements ISysLogininforService { + + private final SysLogininforMapper baseMapper; + + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + + @Override + public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { + Map params = logininfor.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("info_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininforBo bo) { + SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); + logininfor.setLoginTime(new Date()); + baseMapper.insert(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininforBo logininfor) { + Map params = logininfor.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysLogininfor::getInfoId)); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return baseMapper.deleteBatchIds(Arrays.asList(infoIds)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..82b4317 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,476 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MetaVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.mapper.SysMenuMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysMenuService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 菜单 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysMenuServiceImpl implements ISysMenuService { + + private final SysMenuMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysTenantPackageMapper tenantPackageMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId,Long useType) { + return selectMenuList(new SysMenuBo(), userId,useType); + } + + /** + * 查询系统菜单列表 + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuList(SysMenuBo menu, Long userId,Long useType) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) +// .apply("FIND_IN_SET({0}, use_type) > 0",useType == null ? BusRole.PLATFORM.getId():useType) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + List menuList1 = new ArrayList<>(); + for(SysMenuVo menuVo:menuList){ + if(!"F".equals(menuVo.getMenuType()) && menuVo.getUseType() != null && menuVo.getUseType().contains( + (useType == null ? BusRole.PLATFORM.getId():useType)+"")){ + menuList1.add(menuVo); + } else if("F".equals(menuVo.getMenuType())){ + menuList1.add(menuVo); + } + } + menuList = menuList1; + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + + /** + * 查询系统菜单列表 + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenuBo menu, Long userId) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) +// .apply("FIND_IN_SET({0}, use_type)",) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + + /*** + * 查询当前用户的菜单 + * @param menu + * @param userId + * @return + */ + public List selectCurrentUserMenuList(SysMenuBo menu, Long userId) { + List menuList; + LoginUser loginUser = LoginHelper.getLoginUser(); + + menu.setVisible("0"); + menu.setStatus("0"); + + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + if(loginUser.getRoleDataRange().intValue() == 1){ + //取角色 + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + }else{ + //取个人 + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("rm.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserIdNew(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + + + } + return menuList; + } + + + + + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = baseMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId,Integer roleDataRange) { + List menus; + if (LoginHelper.isSuperAdmin(userId)) { + menus = baseMapper.selectMenuTreeAll(); + } else { + if(roleDataRange == 2) { + menus = baseMapper.selectMenuTreeByUserIdNew(userId); + }else { + menus = baseMapper.selectMenuTreeByUserId(userId); + } + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + + @Override + public List selectMenuListByUserId(Long userId) { + return baseMapper.selectOperMenuListByUserId(userId); + } + + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return new ArrayList<>(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysMenu::getParentId) + .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList<>(); + for (SysMenu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(menu.getRouteName()); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); + router.setQuery(menu.getQueryParam()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (CollUtil.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (menu.isMenuFrame()) { + router.setMeta(null); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQueryParam()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); + } + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return baseMapper.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenuBo menu) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysMenu::getMenuName, menu.getMenuName()) + .eq(SysMenu::getParentId, menu.getParentId()) + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); + return !exist; + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); + for (SysMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); + t.setChildren(childList); + for (SysMenu tChild : childList) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { + recursionFn(list, tChild); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..c4e081c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,172 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 公告 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysNoticeServiceImpl implements ISysNoticeService { + + private final SysNoticeMapper baseMapper; + private final SysUserMapper userMapper; + + @Override + public TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + + @Override + public TableDataInfo selectPageNoticeListByUser(SysNoticeBo notice, PageQuery pageQuery) { + Integer busRole = LoginHelper.getBusRole(); + notice.setBusRole(busRole); + + QueryWrapper lqw = buildQueryWrapper2(notice); + Page page = baseMapper.selectPageNoticeListByUser(pageQuery.build(), lqw, LoginHelper.getUserId()); + return TableDataInfo.build(page); + } + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public SysNoticeVo selectNoticeById(Long noticeId) { + //产看详情 + //在 阅读表里 产看是否存在 + if(baseMapper.selectNoticeReadByUser(LoginHelper.getUserId(),noticeId) == 0){ + baseMapper.insertNoticeRead(LoginHelper.getUserId(),noticeId); + } + + return baseMapper.selectVoById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(SysNoticeBo notice) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysNoticeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); + lqw.eq(SysNotice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + lqw.orderByAsc(SysNotice::getNoticeId); + return lqw; + } + + + private QueryWrapper buildQueryWrapper2(SysNoticeBo bo) { + QueryWrapper lqw = Wrappers.query(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), "sys_notice.notice_title", bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), "sys_notice.notice_type", bo.getNoticeType()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), "sys_notice_role.bus_role", bo.getBusRole()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); + lqw.eq("sys_notice.create_by", ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + lqw.orderByDesc("sys_notice.create_time"); + return lqw; + } + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + + if(null == bo.getBusRoles() || bo.getBusRoles().length == 0){ + throw new IllegalArgumentException("接收角色不能为空"); + } + int count = baseMapper.insert(notice); + baseMapper.deleteNoticeRole(notice.getNoticeId()); + baseMapper.insertNoticeRole(notice.getNoticeId(), bo.getBusRoles()); + //处理角色 公告信息 + return count; + } + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + + if(null == bo.getBusRoles() || bo.getBusRoles().length == 0){ + throw new IllegalArgumentException("接收角色不能为空"); + } + int count = baseMapper.updateById(notice); + baseMapper.deleteNoticeRole(notice.getNoticeId()); + baseMapper.insertNoticeRole(notice.getNoticeId(), bo.getBusRoles()); + + return count; + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + return baseMapper.deleteById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + return baseMapper.deleteBatchIds(Arrays.asList(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..ce9ab23 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,129 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.mapper.SysOperLogMapper; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 操作日志 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOperLogServiceImpl implements ISysOperLogService { + + private final SysOperLogMapper baseMapper; + + + @Override + public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { + Map params = operLog.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + SysOperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null, + SysOperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("oper_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLogBo bo) { + SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); + operLog.setOperTime(new Date()); + baseMapper.insert(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLogBo operLog) { + Map params = operLog.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + SysOperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null && operLog.getStatus() > 0, + SysOperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysOperLog::getOperId)); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + return baseMapper.deleteBatchIds(Arrays.asList(operIds)); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLogVo selectOperLogById(Long operId) { + return baseMapper.selectVoById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..7ccae4b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,61 @@ +package org.dromara.system.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysMenuService; +import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysRoleService; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.Set; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +public class SysPermissionServiceImpl implements ISysPermissionService { + + private final ISysRoleService roleService; + private final ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + @Override + public Set getRolePermission(Long userId) { + Set roles = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(userId)); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + @Override + public Set getMenuPermission(Long userId) { + Set perms = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + perms.add("*:*:*"); + } else { + perms.addAll(menuService.selectMenuPermsByUserId(userId)); + } + return perms; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..1c65a48 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,188 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysUserPostMapper; +import org.dromara.system.service.ISysPostService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 岗位信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysPostServiceImpl implements ISysPostService { + + private final SysPostMapper baseMapper; + private final SysUserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPostBo post) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()); + lqw.like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()); + lqw.orderByAsc(SysPost::getPostSort); + return lqw; + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + return baseMapper.selectPostListByUserId(userId); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public long countUserPostById(Long postId) { + return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return baseMapper.deleteById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + SysPost post = baseMapper.selectById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); + } + } + return baseMapper.deleteBatchIds(Arrays.asList(postIds)); + } + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.insert(post); + } + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.updateById(post); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..e46497e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,486 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +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.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.system.service.ISysRoleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysRoleServiceImpl implements ISysRoleService { + + private final SysRoleMapper baseMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysRoleDeptMapper roleDeptMapper; + + @Override + public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + public List selectRoleList(SysRoleBo role) { + return baseMapper.selectRoleList(this.buildQueryWrapper(role)); + } + + private Wrapper buildQueryWrapper(SysRoleBo bo) { + Map params = bo.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL) + .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) + .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), "r.status", bo.getStatus()) + .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "r.create_time", params.get("beginTime"), params.get("endTime")) + .orderByAsc("r.role_sort").orderByAsc("r.create_time");; + return wrapper; + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) { + List userRoles = baseMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRoleVo role : roles) { + for (SysRoleVo userRole : userRoles) { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + List perms = baseMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRoleVo perm : perms) { + if (ObjectUtil.isNotNull(perm)) { + permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() { + return this.selectRoleList(new SysRoleBo()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + return baseMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRoleVo selectRoleById(Long roleId) { + return baseMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleName, role.getRoleName()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleKey, role.getRoleKey()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRoleBo role) { + if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { + throw new ServiceException("不允许操作超级管理员角色"); + } + String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; + // 新增不允许使用 管理员标识符 + if (ObjectUtil.isNull(role.getRoleId()) + && StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + // 修改不允许修改 管理员标识符 + if (ObjectUtil.isNotNull(role.getRoleId())) { + SysRole sysRole = baseMapper.selectById(role.getRoleId()); + // 如果标识符不相等 判断为修改了管理员标识符 + if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())) { + if (StringUtils.equalsAny(sysRole.getRoleKey(), keys)) { + throw new ServiceException("不允许修改系统内置管理员角色标识符!"); + } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + } + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roles = this.selectRoleList(new SysRoleBo(roleId)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public long countUserRoleByRoleId(Long roleId) { + return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + } + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 新增角色信息 + baseMapper.insert(role); + bo.setRoleId(role.getRoleId()); + return insertRoleMenu(bo); + } + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, role.getRoleId())); + return insertRoleMenu(bo); + } + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + @Override + public int updateRoleStatus(Long roleId, String status) { + if (UserConstants.ROLE_DISABLE.equals(status) && this.countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysRole::getStatus, status) + .eq(SysRole::getRoleId, roleId)); + } + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int authDataScope(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); + // 新增角色和部门信息(数据权限) + return insertRoleDept(bo); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + private int insertRoleMenu(SysRoleBo role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + private int insertRoleDept(SysRoleBo role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, roleId)); + return baseMapper.deleteById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + SysRole role = baseMapper.selectById(roleId); + checkRoleAllowed(BeanUtil.toBean(role, SysRoleBo.class)); + checkRoleDataScope(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); + } + } + List ids = Arrays.asList(roleIds); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); + return baseMapper.deleteBatchIds(ids); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, userRole.getRoleId()) + .eq(SysUserRole::getUserId, userRole.getUserId())); + if (rows > 0) { + cleanOnlineUserByRole(userRole.getRoleId()); + } + return rows; + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, roleId) + .in(SysUserRole::getUserId, Arrays.asList(userIds))); + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + int rows = 1; + List list = StreamUtils.toList(List.of(userIds), userId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + if (CollUtil.isNotEmpty(list)) { + rows = userRoleMapper.insertBatch(list) ? list.size() : 0; + } + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + @Override + public void cleanOnlineUserByRole(Long roleId) { + // 如果角色未绑定用户 直接返回 + Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + if (num == 0) { + return; + } + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return; + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (loginUser != null && loginUser.getRoles() != null && loginUser.getRoles().stream().anyMatch(r -> roleId.equals(r.getRoleId()))) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..369ac6a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java new file mode 100644 index 0000000..a35a708 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java @@ -0,0 +1,107 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.mapper.SysSocialMapper; +import org.dromara.system.service.ISysSocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系Service业务层处理 + * + * @author thiszhc + * @date 2023-06-12 + */ +@RequiredArgsConstructor +@Service +public class SysSocialServiceImpl implements ISysSocialService { + + private final SysSocialMapper baseMapper; + + + /** + * 查询社会化关系 + */ + @Override + public SysSocialVo queryById(String id) { + return baseMapper.selectVoById(id); + } + + /** + * 授权列表 + */ + @Override + public List queryList() { + return baseMapper.selectVoList(); + } + + @Override + public List queryListByUserId(Long userId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getUserId, userId)); + } + + + /** + * 新增社会化关系 + */ + @Override + public Boolean insertByBo(SysSocialBo bo) { + SysSocial add = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + if (add != null) { + bo.setId(add.getId()); + } else { + return false; + } + } + return flag; + } + + /** + * 更新社会化关系 + */ + @Override + public Boolean updateByBo(SysSocialBo bo) { + SysSocial update = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSocial entity) { + //TODO 做一些数据校验,如唯一约束 + } + + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long id) { + return baseMapper.deleteById(id) > 0; + } + + + /** + * 根据 authId 查询用户信息 + * + * @param authId 认证id + * @return 授权信息 + */ + @Override + public List selectByAuthId(String authId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getAuthId, authId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java new file mode 100644 index 0000000..f7f8d46 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.mapper.SysTenantMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantPackageServiceImpl implements ISysTenantPackageService { + + private final SysTenantPackageMapper baseMapper; + private final SysTenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public SysTenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(SysTenantPackage::getStatus, TenantConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenantPackage::getPackageId); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantPackageBo bo) { + SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + add.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + add.setMenuIds(""); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPackageId(add.getPackageId()); + } + return flag; + } + + /** + * 修改租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysTenantPackageBo bo) { + SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + update.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + update.setMenuIds(""); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(SysTenantPackageBo bo) { + SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); + return baseMapper.updateById(tenantPackage); + } + + /** + * 批量删除租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..516149f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,372 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysTenantService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 租户Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantServiceImpl implements ISysTenantService { + + private final SysTenantMapper baseMapper; + private final SysTenantPackageMapper tenantPackageMapper; + private final SysUserMapper userMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysDictTypeMapper dictTypeMapper; + private final SysDictDataMapper dictDataMapper; + private final SysConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public SysTenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public SysTenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(SysTenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenant::getId); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantBo bo) { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); + + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); + + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + //新增系统用户后,默认当前用户为部门的负责人 + SysDept sd = new SysDept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); + + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + return true; + } + + /** + * 生成租户id + * + * @param tenantIds 已有租户id列表 + * @return 租户id + */ + private String generateTenantId(List tenantIds) { + // 随机生成6位 + String numbers = RandomUtil.randomNumbers(6); + // 判断是否存在,如果存在则重新生成 + if (tenantIds.contains(numbers)) { + generateTenantId(tenantIds); + } + return numbers; + } + + /** + * 根据租户菜单创建租户角色 + * + * @param tenantId 租户编号 + * @param packageId 租户套餐id + * @return 角色id + */ + private Long createTenantRole(String tenantId, Long packageId) { + // 获取租户套餐 + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + SysRole role = new SysRole(); + role.setTenantId(tenantId); + role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); + role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); + role.setRoleSort(1); + role.setStatus(TenantConstants.NORMAL); + roleMapper.insert(role); + Long roleId = role.getRoleId(); + + // 创建角色菜单 + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.insertBatch(roleMenus); + + return roleId; + } + + /** + * 修改租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public Boolean updateByBo(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + tenant.setTenantId(null); + tenant.setPackageId(null); + return baseMapper.updateById(tenant) > 0; + } + + /** + * 修改租户状态 + * + * @param bo 租户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public int updateTenantStatus(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + return baseMapper.updateById(tenant); + } + + /** + * 校验租户是否允许操作 + * + * @param tenantId 租户ID + */ + @Override + public void checkTenantAllowed(String tenantId) { + if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + throw new ServiceException("不允许操作管理租户"); + } + } + + /** + * 批量删除租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { + throw new ServiceException("超管租户不能删除"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(SysTenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果余额为-1代表不限制 + if (tenant.getAccountCount() == -1) { + return true; + } + Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); + // 如果余额大于0代表还有可用名额 + return tenant.getAccountCount() - userNumber > 0; + } + + /** + * 校验有效期 + */ + @Override + public boolean checkExpireTime(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果未设置过期时间代表不限制 + if (ObjectUtil.isNull(tenant.getExpireTime())) { + return true; + } + // 如果当前时间在过期时间之前则通过 + return new Date().before(tenant.getExpireTime()); + } + + /** + * 同步租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncTenantPackage(String tenantId, Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java new file mode 100644 index 0000000..cb50e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java @@ -0,0 +1,133 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.mapper.SysUnitDomainMapper; +import org.dromara.system.service.ISysUnitDomainService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 单位域名配置Service业务层处理 + * + * @author LionLi + * @date 2024-03-29 + */ +@RequiredArgsConstructor +@Service +public class SysUnitDomainServiceImpl implements ISysUnitDomainService { + + private final SysUnitDomainMapper baseMapper; + + /** + * 查询单位域名配置 + */ + @Override + public SysUnitDomainVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public SysUnitDomainVo queryByDomainName(String domain) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysUnitDomain::getDomainName,domain); + return baseMapper.selectVoOne(lqw); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public List queryList(SysUnitDomainBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitDomainBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDomainName()), SysUnitDomain::getDomainName, bo.getDomainName()); + lqw.like(StringUtils.isNotBlank(bo.getWebsiteName()), SysUnitDomain::getWebsiteName, bo.getWebsiteName()); + lqw.eq(StringUtils.isNotBlank(bo.getHotline()), SysUnitDomain::getHotline, bo.getHotline()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyright()), SysUnitDomain::getCopyright, bo.getCopyright()); + lqw.eq(StringUtils.isNotBlank(bo.getRecordNo()), SysUnitDomain::getRecordNo, bo.getRecordNo()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyrightUrl()), SysUnitDomain::getCopyrightUrl, bo.getCopyrightUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageLogo()), SysUnitDomain::getLoginPageLogo, bo.getLoginPageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageBanner()), SysUnitDomain::getLoginPageBanner, bo.getLoginPageBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getHomePageLogo()), SysUnitDomain::getHomePageLogo, bo.getHomePageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapLogo()), SysUnitDomain::getWapLogo, bo.getWapLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapBanner()), SysUnitDomain::getWapBanner, bo.getWapBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatPub()), SysUnitDomain::getWeChatPub, bo.getWeChatPub()); + lqw.eq(StringUtils.isNotBlank(bo.getPcLoginProtocol()), SysUnitDomain::getPcLoginProtocol, bo.getPcLoginProtocol()); + lqw.eq(StringUtils.isNotBlank(bo.getMobileUserAgreement()), SysUnitDomain::getMobileUserAgreement, bo.getMobileUserAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getPrivacyAgreement()), SysUnitDomain::getPrivacyAgreement, bo.getPrivacyAgreement()); + lqw.eq(bo.getStatus() != null, SysUnitDomain::getStatus, bo.getStatus()); + lqw.eq(bo.getBusRole() != null, SysUnitDomain::getBusRole, bo.getBusRole()); + lqw.eq(bo.getBusId() != null, SysUnitDomain::getBusId, bo.getBusId()); + return lqw; + } + + /** + * 新增单位域名配置 + */ + @Override + public Boolean insertByBo(SysUnitDomainBo bo) { + SysUnitDomain add = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位域名配置 + */ + @Override + public Boolean updateByBo(SysUnitDomainBo bo) { + SysUnitDomain update = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnitDomain entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位域名配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..9470b57 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,822 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +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.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 用户 业务层处理 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysUserServiceImpl extends BaseService implements ISysUserService { + + private final SysUserMapper baseMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysPostMapper postMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysUserPostMapper userPostMapper; + private final SysUserMenuMapper sysUserMenuMapper; + + + @Value("${weixin.scanUrl}") + private String scanUrl; + private String scanRedirectUrl; + + @DubboReference + public RemoteWeiXinService remoteWeiXinService; + + + @Override + public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserList(SysUserBo user) { + return baseMapper.selectUserList(this.buildQueryWrapper(user)); + } + + private Wrapper buildQueryWrapper(SysUserBo user) { + Map params = user.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "u.create_time", params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in("u.dept_id", ids); + }).orderByAsc("u.user_id"); + return wrapper; + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { + List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) + .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByUserName(String userName) { + return baseMapper.selectUserByUserName(userName); + } + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByPhonenumber(String phonenumber) { + return baseMapper.selectUserByPhonenumber(phonenumber); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserById(Long userId) { + return baseMapper.selectUserById(userId); + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) { + List list = roleMapper.selectRolesByUserName(userName); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysRoleVo::getRoleName); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) { + List list = postMapper.selectPostsByUserName(userName); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysPostVo::getPostName); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, user.getUserName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkPhoneUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getPhonenumber, user.getPhonenumber()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkEmailUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + @Override + public void checkUserAllowed(Long userId) { + if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) { + if (ObjectUtil.isNull(userId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (ObjectUtil.isNull(baseMapper.selectUserById(userId))) { + throw new ServiceException("没有权限访问用户数据!"); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertUser(SysUserBo user) { + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 新增用户信息 + int rows = baseMapper.insert(sysUser); + user.setUserId(sysUser.getUserId()); + // 新增用户岗位关联 + insertUserPost(user, false); + // 新增用户与角色管理 + insertUserRole(user, false); + return rows; + } + + + @Transactional + public int insertUserNew(SysUserBo user){ + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + LoginUser loginUser = LoginHelper.getLoginUser(); + sysUser.setStatus("0"); + sysUser.setRoleId(LoginHelper.getBusRole()); + sysUser.setCreateBy(LoginHelper.getUserId()); + sysUser.setRoleName(BusRole.getName(sysUser.getRoleId())); + if(StringUtils.isNotEmpty(loginUser.getIds())){ + sysUser.setIds(loginUser.getIds()+","+loginUser.getUserId()); + }else{ + sysUser.setIds(loginUser.getUserId()+""); + } + sysUser.setBusId(LoginHelper.getBusId()); + sysUser.setBusNo(LoginHelper.getNo()); + sysUser.setDelFlag("0"); + return this.baseMapper.insert(sysUser); + } + + + /*** + * 给操作员分配权限 + * @param user + * @return + */ + @Override + @Transactional + public Boolean configUserPer(SysUserBo user) { + + if(user.getUserId() == null){ + this.invalidationParamsException("操作员用户ID不能为空"); + } + +// if(user.getMenuIds() == null || user.getMenuIds().length == 0){ +// this.invalidationParamsException("权限列表不能为空"); +// } + + this.sysUserMenuMapper.delete(new LambdaQueryWrapper().eq(SysUserMenu::getUserId,user.getUserId())); + + List list = new ArrayList<>(); + for (Long menuId : user.getMenuIds()) { + SysUserMenu sysUserMenu = new SysUserMenu(); + sysUserMenu.setUserId(user.getUserId()); + sysUserMenu.setMenuId(menuId); + list.add(sysUserMenu); + } + this.sysUserMenuMapper.insertBatch(list); + + return true; + } + + + /*** + * 变更登录方式 + * @param userId + * @param loginType + * @return + */ + @Override + public int updLoginWay(Long userId, Integer loginType) { + + if(loginType == null || (loginType != 1 && loginType != 2)){ + this.invalidationParamsException("传入参数无效"); + } + + SysUserVo suv = this.selectUserById(userId); + if(suv == null){ + this.invalidationParamsException("无效用户"); + } + + if(StringUtils.isEmpty(suv.getBindOpenId()) && loginType == 2){ + this.invalidationParamsException("请先进行扫码绑定微信!"); + } + SysUser user = new SysUser(); + user.setUserId(userId); + user.setLoginType(loginType); + user.setUpdateTime(new Date()); + user.setUpdateBy(userId); + return this.baseMapper.updateById(user); + } + + + /*** + * 查询登录方式 + * @param userId + * @return + */ + @Override + public Integer selLoginWay(Long userId) { + SysUserVo vo = this.baseMapper.selectUserById(userId); + return vo.getLoginType(); + } + + + + @Override + @Transactional + public int insertBusUser(SysUser sysUser) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, sysUser.getUserName()) + .ne(ObjectUtil.isNotNull(sysUser.getUserId()), SysUser::getUserId, sysUser.getUserId())); + if(exist){ + return -1; + } + int rows = baseMapper.insert(sysUser); + SysUserRole ur = new SysUserRole(); + ur.setUserId(sysUser.getUserId()); + ur.setRoleId(Long.valueOf(sysUser.getRoleId().toString())); + this.userRoleMapper.insert(ur); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUserBo user, String tenantId) { + user.setCreateBy(user.getUserId()); + user.setUpdateBy(user.getUserId()); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + sysUser.setTenantId(tenantId); + return baseMapper.insert(sysUser) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUser(SysUserBo user) { + // 新增用户与角色管理 + insertUserRole(user, true); + // 新增用户与岗位管理 + insertUserPost(user, true); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUserNew(SysUserBo user) { + // 新增用户与角色管理 + // 新增用户与岗位管理 + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + @Override + public int updateUserInfos(SysUser sysUser) { + if(sysUser.getUserId() == null){ + this.invalidationParamsException("用户ID不能为空"); + } + return this.baseMapper.updateById(sysUser); + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertUserAuth(Long userId, Long[] roleIds) { + insertUserRole(userId, roleIds, true); + } + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + @Override + public int updateUserStatus(Long userId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getStatus, status) + .eq(SysUser::getUserId, userId)); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUserBo user) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) + .set(StringUtils.isNotBlank(user.getPhonenumber()),SysUser::getPhonenumber, user.getPhonenumber()) + .set(StringUtils.isNotBlank(user.getEmail()),SysUser::getEmail, user.getEmail()) + .set(StringUtils.isNotBlank(user.getSex()),SysUser::getSex, user.getSex()) + .set(StringUtils.isNotBlank(user.getIsReadProt()),SysUser::getIsReadProt, user.getIsReadProt()) + .set(StringUtils.isNotBlank(user.getIsResetPass()),SysUser::getIsResetPass, user.getIsResetPass()) + .eq(SysUser::getUserId, user.getUserId())); + } + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(Long userId, Long avatar) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getAvatar, avatar) + .eq(SysUser::getUserId, userId)) > 0; + } + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(Long userId, String password) { + return baseMapper.update( null, new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, userId)); + } + + @Override + public int resetMyPwd(String srcPwd, String newPwd, String surePwd) { + if(StringUtils.isEmpty(srcPwd)){ + this.invalidationParamsException("原始密码不能为空"); + } + if(StringUtils.isEmpty(newPwd)){ + this.invalidationParamsException("新密码不能为空"); + } + if(StringUtils.isEmpty(surePwd)){ + this.invalidationParamsException("确认新密码不能为空"); + } + + if(!newPwd.equals(surePwd)){ + this.invalidationParamsException("新密码和确认新密码不一致"); + } + Long userId = LoginHelper.getUserId(); + + SysUserVo sysUserVo = this.baseMapper.selectUserById(userId); + + if(!BCrypt.checkpw(srcPwd,sysUserVo.getPassword())){ + this.invalidationParamsException("原始密码错误"); + } + + String password = BCrypt.hashpw(newPwd); + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .set(SysUser::getIsResetPass,1) + .eq(SysUser::getUserId, userId)); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(SysUserBo user, boolean clear) { + this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserPost(SysUserBo user, boolean clear) { + Long[] posts = user.getPostIds(); + if (ArrayUtil.isNotEmpty(posts)) { + if (clear) { + // 删除用户与岗位关联 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, user.getUserId())); + } + // 新增用户与岗位管理 + List list = StreamUtils.toList(Arrays.asList(posts), postId -> { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + return up; + }); + userPostMapper.insertBatch(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { + if (ArrayUtil.isNotEmpty(roleIds)) { + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList(new LambdaQueryWrapper<>()); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色的数据"); + } + List roleList = StreamUtils.toList(roles, SysRoleVo::getRoleId); + if (!LoginHelper.isSuperAdmin(userId)) { + roleList.remove(UserConstants.SUPER_ADMIN_ID); + } + List canDoRoleList = StreamUtils.filter(Arrays.asList(roleIds), roleList::contains); + if (CollUtil.isEmpty(canDoRoleList)) { + throw new ServiceException("没有权限访问角色的数据"); + } + if (clear) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + } + // 新增用户与角色管理 + List list = StreamUtils.toList(canDoRoleList, roleId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + userRoleMapper.insertBatch(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserById(Long userId) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteById(userId); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(userId); + checkUserDataScope(userId); + } + List ids = Arrays.asList(userIds); + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, ids)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteBatchIds(ids); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId + * @return + */ + @Override + public List selectUserListByDept(Long deptId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysUser::getDeptId, deptId); + lqw.orderByAsc(SysUser::getUserId); + return baseMapper.selectVoList(lqw); + } + + @Override + public TableDataInfo selNewUserList(SysUserBo user, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + QueryWrapper lqw = Wrappers.query(); + + lqw.like(StringUtils.isNotEmpty(user.getUserName()),"t.user_name",user.getUserName()); + lqw.like(StringUtils.isNotEmpty(user.getNickName()),"t.nick_name",user.getNickName()); + lqw.like(StringUtils.isNotEmpty(user.getPhonenumber()),"t.phonenumber",user.getPhonenumber()); + lqw.like(StringUtils.isNotEmpty(user.getUnitNo()),"t1.no",user.getUnitNo()); + lqw.like(StringUtils.isNotEmpty(user.getUnitName()),"t1.name",user.getUnitName()); + lqw.eq(user.getRoleId() != null ,"t.role_id",user.getRoleId()); + lqw.eq("t.del_flag","0"); + lqw.ne("t.user_id",loginUser.getUserId()); + + lqw.eq(StringUtils.isNotEmpty(user.getStatus()),"t.status",user.getStatus()); + int busRole = loginUser.getBusRole(); + if(busRole != BusRole.PLATFORM.getId()){ + int roleDataRange = loginUser.getRoleDataRange(); + if(roleDataRange == 1){ + lqw.eq("t1.id",loginUser.getBusId()); +// lqw.ne("t.id",loginUser.getUserId()); + }else{ + lqw.eq("t1.id",loginUser.getBusId()); +// lqw.ne("t.id",loginUser.getUserId()); + lqw.likeRight(StringUtils.isNotEmpty(loginUser.getIds()),"t.ids",loginUser.getIds()); + } + } + + lqw.orderByDesc("t.create_time"); + Page page = baseMapper.selNewUserList(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId") + @Override + public String selectUserNameById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); + } + + @Override + @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId") + public String selectNicknameById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getNickName).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); + } + + + /**** + * 绑定二维码 + * @param domain + * @return + */ + @Override + public String getBindingQr(String domain){ + Long userId = LoginHelper.getUserId(); + SysUserVo userVo = this.baseMapper.selectUserById(userId); + String url=scanUrl+"index.html"+"?username="+userVo.getUserName()+"&domain="+ Base64.encode(domain); + String qrUrl = this.remoteWeiXinService.genPubAuthQrcode(domain,url); + if(StringUtils.isEmpty(qrUrl)){ + this.invalidationParamsException("获取二维码失败"); + } + return qrUrl; + } + + + @Override + public Boolean bindWeixinOpenId(String domain,String code,String username){ + + domain = Base64.decodeStr(domain); + String openId = this.remoteWeiXinService.getOpenId(domain,code); + if(StringUtils.isEmpty(openId)){ + this.invalidationParamsException("获取OpenId失败"); + } + + SysUserVo vo = this.baseMapper.selectUserByUserName(username); + if(vo == null){ + this.invalidationParamsException("用户名无效!"); + } + SysUser user = new SysUser(); + user.setUserId(vo.getUserId()); + user.setBindOpenId(openId); + user.setUpdateTime(new Date()); + this.baseMapper.updateBindUserOpenid(user); + return true; + + } + + @Override + public String updateReadProTag() { + Long userId = LoginHelper.getUserId(); + SysUser user = new SysUser(); + user.setIsReadProt(1); + user.setUserId(userId); + user.setUpdateTime(new Date()); + user.setUpdateBy(userId); + this.baseMapper.updateById(user); + return "true"; + } + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/application.yml b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml new file mode 100644 index 0000000..4000023 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9201 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-system + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml new file mode 100644 index 0000000..d37a05c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + insert into bpm_order_num(dtm_time,v_process_name,i_max_num)values( + #{dtm_time},#{v_process_name},#{i_max_num} ) + + + + + + update bpm_order_num set i_max_num = #{i_max_num} where v_process_name = #{v_process_name} and dtm_time = #{dtm_time} + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml new file mode 100644 index 0000000..a7e7f0c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml new file mode 100644 index 0000000..fd150ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..e542a10 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..bba949d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..6bcce51 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..6975da4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml new file mode 100644 index 0000000..1da9ac6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..c64b551 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..a5da51f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..f666773 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + insert into sys_notice_user_reader(notice_id,user_id,create_time ) + values (#{noticeId},#{userId},now()) + + + + insert into sys_notice_role(notice_id,bus_role ) + values + + + + (#{noticeId},#{item} ) + + + + + + delete from sys_notice_role where notice_id = #{noticeId} + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..5ef14ee --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..d2108eb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..1705bb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..b191698 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys_role r + left join sys_user_role sur on sur.role_id = r.role_id + left join sys_user u on u.user_id = sur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..f01dc5e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml new file mode 100644 index 0000000..baa4b59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml new file mode 100644 index 0000000..0d96e13 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml new file mode 100644 index 0000000..79cf4c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml new file mode 100644 index 0000000..d501f23 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..c7e53e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, + u.tenant_id, + u.dept_id, + u.user_name, + u.nick_name, + u.user_type, + u.email, + u.avatar, + u.phonenumber, + u.password, + u.sex, + u.status, + u.ids, + u.del_flag, + u.login_first, + u.login_ip, + u.login_date, + u.create_by, + u.create_time, + u.remark, + u.login_type, + u.bind_open_id, + u.is_read_prot, + u.is_reset_pass, + u.is_reset_paypass, + u.bus_id, + u.bus_no, + u.role_id cur_role_id, + u.role_name cur_role_name, + u.bus_id, + u.role_data_range, + d.dept_id, + d.parent_id, + d.ancestors, + d.dept_name, + d.order_num, + d.leader, + d.status as dept_status, + r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.status as role_status, + su.name as unitName + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role sur on u.user_id = sur.user_id + left join sys_role r on r.role_id = sur.role_id + left join sys_unit su on u.bus_id = su.id + + + + + + + + + + + + + + + + + + + + + + + + + update sys_user set bind_open_id = #{bindOpenId},update_time = now() where user_id = #{userId} + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml new file mode 100644 index 0000000..0401f2e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..e9f2496 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..bc52d1a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml new file mode 100644 index 0000000..b7125c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java b/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java new file mode 100644 index 0000000..df2d500 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java @@ -0,0 +1,142 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysIndustryMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class SysIndustryServiceImplTest { + + @Autowired + private SysIndustryServiceImpl sysIndustryService; + + @Autowired + private SysIndustryMapper baseMapper; + + @Autowired + private SysDictDataMapper sysDictDataMapper; + + + + @Test + public void testInsertDictData(){ + + String json = "{\"success\":true,\"message\":\"操作成功!\",\"code\":0,\"result\":[{\"value\":\"102100099996\",\"text\":\"中国工商银行\",\"title\":\"中国工商银行\"},{\"value\":\"103100000026\",\"text\":\"中国农业银行\",\"title\":\"中国农业银行\"},{\"value\":\"104100000004\",\"text\":\"中国银行\",\"title\":\"中国银行\"},{\"value\":\"403100000004\",\"text\":\"中国邮政储蓄银行\",\"title\":\"中国邮政储蓄银行\"},{\"value\":\"301290000007\",\"text\":\"交通银行\",\"title\":\"交通银行\"},{\"value\":\"302100011000\",\"text\":\"中信银行\",\"title\":\"中信银行\"},{\"value\":\"303100000006\",\"text\":\"中国光大银行\",\"title\":\"中国光大银行\"},{\"value\":\"304100040000\",\"text\":\"华夏银行\",\"title\":\"华夏银行\"},{\"value\":\"305100000013\",\"text\":\"中国民生银行\",\"title\":\"中国民生银行\"},{\"value\":\"306581000003\",\"text\":\"广发银行\",\"title\":\"广发银行\"},{\"value\":\"307584007998\",\"text\":\"平安银行\",\"title\":\"平安银行\"},{\"value\":\"308584000013\",\"text\":\"招商银行\",\"title\":\"招商银行\"},{\"value\":\"309391000011\",\"text\":\"兴业银行\",\"title\":\"兴业银行\"},{\"value\":\"310290000013\",\"text\":\"上海浦东发展银行\",\"title\":\"上海浦东发展银行\"},{\"value\":\"313100000013\",\"text\":\"北京银行\",\"title\":\"北京银行\"},{\"value\":\"313110000017\",\"text\":\"天津银行\",\"title\":\"天津银行\"},{\"value\":\"313121006888\",\"text\":\"河北银行\",\"title\":\"河北银行\"},{\"value\":\"313124000018\",\"text\":\"唐山银行\",\"title\":\"唐山银行\"},{\"value\":\"313126001022\",\"text\":\"秦皇岛银行\",\"title\":\"秦皇岛银行\"},{\"value\":\"313127000013\",\"text\":\"邯郸银行\",\"title\":\"邯郸银行\"},{\"value\":\"313131000016\",\"text\":\"邢台银行\",\"title\":\"邢台银行\"},{\"value\":\"313134000011\",\"text\":\"保定银行\",\"title\":\"保定银行\"},{\"value\":\"313138000019\",\"text\":\"张家口银行\",\"title\":\"张家口银行\"},{\"value\":\"313141052422\",\"text\":\"承德银行\",\"title\":\"承德银行\"},{\"value\":\"313143005157\",\"text\":\"沧州银行\",\"title\":\"沧州银行\"},{\"value\":\"313146000019\",\"text\":\"廊坊银行\",\"title\":\"廊坊银行\"},{\"value\":\"313148053964\",\"text\":\"衡水银行\",\"title\":\"衡水银行\"},{\"value\":\"313161000017\",\"text\":\"晋商银行\",\"title\":\"晋商银行\"},{\"value\":\"313162055820\",\"text\":\"大同银行\",\"title\":\"大同银行\"},{\"value\":\"313163000004\",\"text\":\"阳泉市商业银行\",\"title\":\"阳泉市商业银行\"},{\"value\":\"313164000006\",\"text\":\"长治银行\",\"title\":\"长治银行\"},{\"value\":\"313168000003\",\"text\":\"晋城银行\",\"title\":\"晋城银行\"},{\"value\":\"313175000011\",\"text\":\"晋中银行\",\"title\":\"晋中银行\"},{\"value\":\"313191000011\",\"text\":\"内蒙古银行\",\"title\":\"内蒙古银行\"},{\"value\":\"313192000013\",\"text\":\"包商银行\",\"title\":\"包商银行\"},{\"value\":\"313193057846\",\"text\":\"乌海银行\",\"title\":\"乌海银行\"},{\"value\":\"313221030008\",\"text\":\"盛京银行\",\"title\":\"盛京银行\"},{\"value\":\"313205057830\",\"text\":\"鄂尔多斯银行\",\"title\":\"鄂尔多斯银行\"},{\"value\":\"313222080002\",\"text\":\"大连银行\",\"title\":\"大连银行\"},{\"value\":\"313223007007\",\"text\":\"鞍山银行\",\"title\":\"鞍山银行\"},{\"value\":\"313224000015\",\"text\":\"抚顺银行\",\"title\":\"抚顺银行\"},{\"value\":\"313225000017\",\"text\":\"本溪市商业银行\",\"title\":\"本溪市商业银行\"},{\"value\":\"313226009000\",\"text\":\"丹东银行\",\"title\":\"丹东银行\"},{\"value\":\"313227000012\",\"text\":\"锦州银行\",\"title\":\"锦州银行\"},{\"value\":\"313227600018\",\"text\":\"葫芦岛银行\",\"title\":\"葫芦岛银行\"},{\"value\":\"313228000276\",\"text\":\"营口银行\",\"title\":\"营口银行\"},{\"value\":\"313228060009\",\"text\":\"营口沿海银行\",\"title\":\"营口沿海银行\"},{\"value\":\"313229000008\",\"text\":\"阜新银行\",\"title\":\"阜新银行\"},{\"value\":\"313231000013\",\"text\":\"辽阳银行\",\"title\":\"辽阳银行\"},{\"value\":\"313232000015\",\"text\":\"盘锦银行\",\"title\":\"盘锦银行\"},{\"value\":\"313233000017\",\"text\":\"铁岭银行\",\"title\":\"铁岭银行\"},{\"value\":\"313234001089\",\"text\":\"朝阳银行\",\"title\":\"朝阳银行\"},{\"value\":\"313241066661\",\"text\":\"吉林银行\",\"title\":\"吉林银行\"},{\"value\":\"313261000018\",\"text\":\"哈尔滨银行\",\"title\":\"哈尔滨银行\"},{\"value\":\"313261099913\",\"text\":\"龙江银行\",\"title\":\"龙江银行\"},{\"value\":\"313301008887\",\"text\":\"南京银行\",\"title\":\"南京银行\"},{\"value\":\"313301099999\",\"text\":\"江苏银行\",\"title\":\"江苏银行\"},{\"value\":\"313305066661\",\"text\":\"苏州银行\",\"title\":\"苏州银行\"},{\"value\":\"313312300018\",\"text\":\"江苏长江商业银行\",\"title\":\"江苏长江商业银行\"},{\"value\":\"313331000014\",\"text\":\"杭州银行\",\"title\":\"杭州银行\"},{\"value\":\"313332040018\",\"text\":\"宁波东海银行\",\"title\":\"宁波东海银行\"},{\"value\":\"313332082914\",\"text\":\"宁波银行\",\"title\":\"宁波银行\"},{\"value\":\"313332090019\",\"text\":\"宁波通商银行\",\"title\":\"宁波通商银行\"},{\"value\":\"313333007331\",\"text\":\"温州银行\",\"title\":\"温州银行\"},{\"value\":\"313335081005\",\"text\":\"嘉兴银行\",\"title\":\"嘉兴银行\"},{\"value\":\"313336071575\",\"text\":\"湖州银行\",\"title\":\"湖州银行\"},{\"value\":\"313337009004\",\"text\":\"绍兴银行\",\"title\":\"绍兴银行\"},{\"value\":\"313338009688\",\"text\":\"金华银行\",\"title\":\"金华银行\"},{\"value\":\"313338707013\",\"text\":\"浙江稠州商业银行\",\"title\":\"浙江稠州商业银行\"},{\"value\":\"313345001665\",\"text\":\"台州银行\",\"title\":\"台州银行\"},{\"value\":\"313345010019\",\"text\":\"浙江泰隆商业银行\",\"title\":\"浙江泰隆商业银行\"},{\"value\":\"313345400010\",\"text\":\"浙江民泰商业银行\",\"title\":\"浙江民泰商业银行\"},{\"value\":\"313391080007\",\"text\":\"福建海峡银行\",\"title\":\"福建海峡银行\"},{\"value\":\"313393080005\",\"text\":\"厦门银行\",\"title\":\"厦门银行\"},{\"value\":\"313397075189\",\"text\":\"泉州银行\",\"title\":\"泉州银行\"},{\"value\":\"313421087506\",\"text\":\"江西银行\",\"title\":\"江西银行\"},{\"value\":\"313424076706\",\"text\":\"九江银行\",\"title\":\"九江银行\"},{\"value\":\"313428076517\",\"text\":\"赣州银行\",\"title\":\"赣州银行\"},{\"value\":\"313433076801\",\"text\":\"上饶银行\",\"title\":\"上饶银行\"},{\"value\":\"313451000019\",\"text\":\"齐鲁银行\",\"title\":\"齐鲁银行\"},{\"value\":\"313452060150\",\"text\":\"青岛银行\",\"title\":\"青岛银行\"},{\"value\":\"313453001017\",\"text\":\"齐商银行\",\"title\":\"齐商银行\"},{\"value\":\"313454000016\",\"text\":\"枣庄银行\",\"title\":\"枣庄银行\"},{\"value\":\"313455000018\",\"text\":\"东营银行\",\"title\":\"东营银行\"},{\"value\":\"313456000108\",\"text\":\"烟台银行\",\"title\":\"烟台银行\"},{\"value\":\"313458000013\",\"text\":\"潍坊银行\",\"title\":\"潍坊银行\"},{\"value\":\"313461000012\",\"text\":\"济宁银行\",\"title\":\"济宁银行\"},{\"value\":\"313463000993\",\"text\":\"泰安银行\",\"title\":\"泰安银行\"},{\"value\":\"313463400019\",\"text\":\"莱商银行\",\"title\":\"莱商银行\"},{\"value\":\"313465000010\",\"text\":\"威海市商业银行\",\"title\":\"威海市商业银行\"},{\"value\":\"313468000015\",\"text\":\"德州银行\",\"title\":\"德州银行\"},{\"value\":\"313473070018\",\"text\":\"临商银行\",\"title\":\"临商银行\"},{\"value\":\"313473200011\",\"text\":\"日照银行\",\"title\":\"日照银行\"},{\"value\":\"313491000232\",\"text\":\"郑州银行\",\"title\":\"郑州银行\"},{\"value\":\"313491099996\",\"text\":\"中原银行\",\"title\":\"中原银行\"},{\"value\":\"313493080539\",\"text\":\"洛阳银行\",\"title\":\"洛阳银行\"},{\"value\":\"313495081900\",\"text\":\"平顶山银行\",\"title\":\"平顶山银行\"},{\"value\":\"313501080608\",\"text\":\"焦作中旅银行\",\"title\":\"焦作中旅银行\"},{\"value\":\"313521000011\",\"text\":\"汉口银行\",\"title\":\"汉口银行\"},{\"value\":\"313521006000\",\"text\":\"湖北银行\",\"title\":\"湖北银行\"},{\"value\":\"313551070008\",\"text\":\"华融湘江银行\",\"title\":\"华融湘江银行\"},{\"value\":\"313551088886\",\"text\":\"长沙银行\",\"title\":\"长沙银行\"},{\"value\":\"313581003284\",\"text\":\"广州银行\",\"title\":\"广州银行\"},{\"value\":\"313585000990\",\"text\":\"珠海华润银行\",\"title\":\"珠海华润银行\"},{\"value\":\"313586000006\",\"text\":\"广东华兴银行\",\"title\":\"广东华兴银行\"},{\"value\":\"313591001001\",\"text\":\"广东南粤银行\",\"title\":\"广东南粤银行\"},{\"value\":\"313602088017\",\"text\":\"东莞银行\",\"title\":\"东莞银行\"},{\"value\":\"313611001018\",\"text\":\"广西北部湾银行\",\"title\":\"广西北部湾银行\"},{\"value\":\"313614000012\",\"text\":\"柳州银行\",\"title\":\"柳州银行\"},{\"value\":\"313617000018\",\"text\":\"桂林银行\",\"title\":\"桂林银行\"},{\"value\":\"313641099995\",\"text\":\"海南银行\",\"title\":\"海南银行\"},{\"value\":\"313651099999\",\"text\":\"成都银行\",\"title\":\"成都银行\"},{\"value\":\"313653000013\",\"text\":\"重庆银行\",\"title\":\"重庆银行\"},{\"value\":\"313655091983\",\"text\":\"自贡银行\",\"title\":\"自贡银行\"},{\"value\":\"313651071504\",\"text\":\"四川银行\",\"title\":\"四川银行\"},{\"value\":\"313657092617\",\"text\":\"泸州市商业银\",\"title\":\"泸州市商业银\"},{\"value\":\"313658000014\",\"text\":\"长城华西银行\",\"title\":\"长城华西银行\"},{\"value\":\"313659000016\",\"text\":\"绵阳市商业银行\",\"title\":\"绵阳市商业银行\"},{\"value\":\"313662000015\",\"text\":\"遂宁银行\",\"title\":\"遂宁银行\"},{\"value\":\"313665092924\",\"text\":\"乐山市商业银行\",\"title\":\"乐山市商业银行\"},{\"value\":\"313671000017\",\"text\":\"宜宾市商业银\",\"title\":\"宜宾市商业银\"},{\"value\":\"313673093259\",\"text\":\"四川天府银行\",\"title\":\"四川天府银行\"},{\"value\":\"313675090019\",\"text\":\"达州市商业银行\",\"title\":\"达州市商业银行\"},{\"value\":\"313677000010\",\"text\":\"雅安市商业银行\",\"title\":\"雅安市商业银行\"},{\"value\":\"313684093748\",\"text\":\"凉山州商业银行\",\"title\":\"凉山州商业银行\"},{\"value\":\"313701098010\",\"text\":\"贵阳银行\",\"title\":\"贵阳银行\"},{\"value\":\"313701099012\",\"text\":\"贵州银行\",\"title\":\"贵州银行\"},{\"value\":\"313731010015\",\"text\":\"富滇银行\",\"title\":\"富滇银行\"},{\"value\":\"313736000019\",\"text\":\"曲靖市商业银行\",\"title\":\"曲靖市商业银行\"},{\"value\":\"313741095715\",\"text\":\"云南红塔银行\",\"title\":\"云南红塔银行\"},{\"value\":\"313770000016\",\"text\":\"西藏银行\",\"title\":\"西藏银行\"},{\"value\":\"313791000015\",\"text\":\"西安银行\",\"title\":\"西安银行\"},{\"value\":\"313791030003\",\"text\":\"长安银行\",\"title\":\"长安银行\"},{\"value\":\"313821001016\",\"text\":\"兰州银行\",\"title\":\"兰州银行\"},{\"value\":\"313821050016\",\"text\":\"甘肃银行\",\"title\":\"甘肃银行\"},{\"value\":\"313851000018\",\"text\":\"青海银行\",\"title\":\"青海银行\"},{\"value\":\"313871000007\",\"text\":\"宁夏银行\",\"title\":\"宁夏银行\"},{\"value\":\"313872097457\",\"text\":\"石嘴山银行\",\"title\":\"石嘴山银行\"},{\"value\":\"313881000002\",\"text\":\"乌鲁木齐银行\",\"title\":\"乌鲁木齐银行\"},{\"value\":\"313882000012\",\"text\":\"昆仑银行\",\"title\":\"昆仑银行\"},{\"value\":\"313884000016\",\"text\":\"哈密市商业银行\",\"title\":\"哈密市商业银行\"},{\"value\":\"313888000013\",\"text\":\"库尔勒银行\",\"title\":\"库尔勒银行\"},{\"value\":\"313898100016\",\"text\":\"新疆汇和银行\",\"title\":\"新疆汇和银行\"},{\"value\":\"314110000011\",\"text\":\"天津滨海农村商业银行\",\"title\":\"天津滨海农村商业银行\"},{\"value\":\"314222001893\",\"text\":\"大连农村商业银行\",\"title\":\"大连农村商业银行\"},{\"value\":\"314302066666\",\"text\":\"无锡农村商业银行\",\"title\":\"无锡农村商业银行\"},{\"value\":\"314302200018\",\"text\":\"江苏江阴农村商业银行\",\"title\":\"江苏江阴农村商业银行\"},{\"value\":\"314304099999\",\"text\":\"江苏江南农村商业银行\",\"title\":\"江苏江南农村商业银行\"},{\"value\":\"314305106644\",\"text\":\"太仓农村商业银行\",\"title\":\"太仓农村商业银行\"},{\"value\":\"314305506621\",\"text\":\"江苏常熟农村商业银行\",\"title\":\"江苏常熟农村商业银行\"},{\"value\":\"314305670002\",\"text\":\"张家港农村商业银行\",\"title\":\"张家港农村商业银行\"},{\"value\":\"314581000011\",\"text\":\"广州农村商业银行\",\"title\":\"广州农村商业银行\"},{\"value\":\"314588000016\",\"text\":\"广东顺德农村银行\",\"title\":\"广东顺德农村银行\"},{\"value\":\"314641000014\",\"text\":\"海口联合农村银行\",\"title\":\"海口联合农村银行\"},{\"value\":\"314651000000\",\"text\":\"成都农商银行\",\"title\":\"成都农商银行\"},{\"value\":\"314653000011\",\"text\":\"重庆农村商业银行\",\"title\":\"重庆农村商业银行\"},{\"value\":\"315456000105\",\"text\":\"恒丰银行\",\"title\":\"恒丰银行\"},{\"value\":\"316331000018\",\"text\":\"浙商银行\",\"title\":\"浙商银行\"},{\"value\":\"317110010019\",\"text\":\"天津农村商业银行\",\"title\":\"天津农村商业银行\"},{\"value\":\"318110000014\",\"text\":\"渤海银行\",\"title\":\"渤海银行\"},{\"value\":\"319361000013\",\"text\":\"徽商银行\",\"title\":\"徽商银行\"},{\"value\":\"321667090019\",\"text\":\"重庆三峡银行\",\"title\":\"重庆三峡银行\"},{\"value\":\"322290000011\",\"text\":\"上海农商银行\",\"title\":\"上海农商银行\"},{\"value\":\"323110000008\",\"text\":\"天津金城银行\",\"title\":\"天津金城银行\"},{\"value\":\"323290000016\",\"text\":\"上海华瑞银行\",\"title\":\"上海华瑞银行\"},{\"value\":\"323331000001\",\"text\":\"浙江网商银行\",\"title\":\"浙江网商银行\"},{\"value\":\"323653010015\",\"text\":\"重庆富民银行\",\"title\":\"重庆富民银行\"},{\"value\":\"325290000012\",\"text\":\"上海银行\",\"title\":\"上海银行\"},{\"value\":\"402100000018\",\"text\":\"北京农村商业银行\",\"title\":\"北京农村商业银行\"},{\"value\":\"402121000009\",\"text\":\"河北省农村信用社联合社\",\"title\":\"河北省农村信用社联合社\"},{\"value\":\"402191009992\",\"text\":\"内蒙古自治区农村信用社联合社\",\"title\":\"内蒙古自治区农村信用社联合社\"},{\"value\":\"402221010013\",\"text\":\"辽宁省农村商业银行\",\"title\":\"辽宁省农村商业银行\"},{\"value\":\"402241000015\",\"text\":\"吉林省农村信用社联合社\",\"title\":\"吉林省农村信用社联合社\"},{\"value\":\"402301099998\",\"text\":\"江苏省农村信用社联合社\",\"title\":\"江苏省农村信用社联合社\"},{\"value\":\"402331000007\",\"text\":\"浙江省农村信用社联合社\",\"title\":\"浙江省农村信用社联合社\"},{\"value\":\"402332010004\",\"text\":\"宁波鄞州农村商业银行\",\"title\":\"宁波鄞州农村商业银行\"},{\"value\":\"402361018886\",\"text\":\"安徽省农村信用社联合社\",\"title\":\"安徽省农村信用社联合社\"},{\"value\":\"402391000068\",\"text\":\"福建省农村信用社联合社\",\"title\":\"福建省农村信用社联合社\"},{\"value\":\"402421099990\",\"text\":\"江西省农村信用社联合社\",\"title\":\"江西省农村信用社联合社\"},{\"value\":\"402451000010\",\"text\":\"山东省农村信用社联合社\",\"title\":\"山东省农村信用社联合社\"},{\"value\":\"402521000032\",\"text\":\"湖北省农村信用社联合社\",\"title\":\"湖北省农村信用社联合社\"},{\"value\":\"402521090019\",\"text\":\"武汉农村商业银行\",\"title\":\"武汉农村商业银行\"},{\"value\":\"402551080008\",\"text\":\"湖南省农村商业银行\",\"title\":\"湖南省农村商业银行\"},{\"value\":\"402584009991\",\"text\":\"深圳农村商业银行\",\"title\":\"深圳农村商业银行\"},{\"value\":\"402602000018\",\"text\":\"东莞农村商业银行\",\"title\":\"东莞农村商业银行\"},{\"value\":\"402641000014\",\"text\":\"海南省农村商业银行\",\"title\":\"海南省农村商业银行\"},{\"value\":\"402651020006\",\"text\":\"四川省农村信用社联合社\",\"title\":\"四川省农村信用社联合社\"},{\"value\":\"402701002999\",\"text\":\"贵州省农村信用社联合社\",\"title\":\"贵州省农村信用社联合社\"},{\"value\":\"402731057238\",\"text\":\"云南省农村信用社联合社\",\"title\":\"云南省农村信用社联合社\"},{\"value\":\"402791000010\",\"text\":\"陕西省农村信用社联合社\",\"title\":\"陕西省农村信用社联合社\"},{\"value\":\"402821000015\",\"text\":\"甘肃省农村商业银行\",\"title\":\"甘肃省农村商业银行\"},{\"value\":\"402851000016\",\"text\":\"青海省农村信用社联合社\",\"title\":\"青海省农村信用社联合社\"},{\"value\":\"402871099996\",\"text\":\"宁夏省农村信用社联合社\",\"title\":\"宁夏省农村信用社联合社\"},{\"value\":\"402881061690\",\"text\":\"新疆省农村商业银行\",\"title\":\"新疆省农村商业银行\"},{\"value\":\"501290000012\",\"text\":\"汇丰银行\",\"title\":\"汇丰银行\"},{\"value\":\"502290000006\",\"text\":\"东亚银行\",\"title\":\"东亚银行\"},{\"value\":\"503290000007\",\"text\":\"南洋商业银行\",\"title\":\"南洋商业银行\"},{\"value\":\"504290005116\",\"text\":\"恒生银行\",\"title\":\"恒生银行\"},{\"value\":\"506391000019\",\"text\":\"集友银行\",\"title\":\"集友银行\"},{\"value\":\"507586000014\",\"text\":\"创兴银行\",\"title\":\"创兴银行\"},{\"value\":\"508584000017\",\"text\":\"大众银行\",\"title\":\"大众银行\"},{\"value\":\"512584050103\",\"text\":\"永隆银行\",\"title\":\"永隆银行\"},{\"value\":\"513584000007\",\"text\":\"大新银行\",\"title\":\"大新银行\"},{\"value\":\"514584000002\",\"text\":\"中信银行国际(中国)有限公司上海分行\",\"title\":\"中信银行国际(中国)有限公司上海分行\"},{\"value\":\"525290094215\",\"text\":\"第一商业银行\",\"title\":\"第一商业银行\"},{\"value\":\"531290088881\",\"text\":\"花旗银行\",\"title\":\"花旗银行\"},{\"value\":\"781393010011\",\"text\":\"厦门国际银行\",\"title\":\"厦门国际银行\"},{\"value\":\"787290000019\",\"text\":\"富邦华一银行\",\"title\":\"富邦华一银行\"},{\"value\":\"904290099992\",\"text\":\"城市商业银行\",\"title\":\"城市商业银行\"},{\"value\":\"905290000008\",\"text\":\"中国银联股份有限公司\",\"title\":\"中国银联股份有限公司\"},{\"value\":\"906731000014\",\"text\":\"昆明银行\",\"title\":\"昆明银行\"},{\"value\":\"911100000005\",\"text\":\"网联清算有限公司\",\"title\":\"网联清算有限公司\"},{\"value\":\"105100000017\",\"text\":\"中国建设银行\",\"title\":\"中国建设银行\"},{\"value\":\"323333000013\",\"text\":\"温州民商银行\",\"title\":\"温州民商银行\"},{\"value\":\"323584000888\",\"text\":\"深圳前海微众银行\",\"title\":\"深圳前海微众银行\"},{\"value\":\"323651066666\",\"text\":\"四川新网银行\",\"title\":\"四川新网银行\"},{\"value\":\"523290000011\",\"text\":\"国泰世华商业银行\",\"title\":\"国泰世华商业银行\"},{\"value\":\"742100000016\",\"text\":\"瑞士银行\",\"title\":\"瑞士银行\"},{\"value\":\"323521012066\",\"text\":\"众邦银行\",\"title\":\"众邦银行\"},{\"value\":\"320177510009\",\"text\":\"襄汾县万都村镇银行\",\"title\":\"襄汾县万都村镇银行\"},{\"value\":\"203100000019\",\"text\":\"中国农业发展银行\",\"title\":\"中国农业发展银行\"},{\"value\":\"402491000026\",\"text\":\"河南省农村信用社联合社\",\"title\":\"河南省农村信用社联合社\"},{\"value\":\"314305400015\",\"text\":\"苏州农村商业银行\",\"title\":\"苏州农村商业银行\"},{\"value\":\"320372500018\",\"text\":\"太和中银富登村镇银行\",\"title\":\"太和中银富登村镇银行\"},{\"value\":\"320372400017\",\"text\":\"临泉中银富登村镇银行\",\"title\":\"临泉中银富登村镇银行\"},{\"value\":\"320372800011\",\"text\":\"阜南中银富登村镇银行\",\"title\":\"阜南中银富登村镇银行\"},{\"value\":\"320373100016\",\"text\":\"界首中银富登村镇银行\",\"title\":\"界首中银富登村镇银行\"},{\"value\":\"320372900012\",\"text\":\"颍上中银富登村镇银行\",\"title\":\"颍上中银富登村镇银行\"},{\"value\":\"320651000852\",\"text\":\"大邑交银兴民村镇银行\",\"title\":\"大邑交银兴民村镇银行\"},{\"value\":\"314305206650\",\"text\":\"昆山农村商业银行\",\"title\":\"昆山农村商业银行\"},{\"value\":\"320493881409\",\"text\":\"洛宁兴福村镇银行\",\"title\":\"洛宁兴福村镇银行\"},{\"value\":\"320428090311\",\"text\":\"江西赣州银座村镇银行\",\"title\":\"江西赣州银座村镇银行\"},{\"value\":\"402261001015\",\"text\":\"哈尔滨农村商业银行\",\"title\":\"哈尔滨农村商业银行\"},{\"value\":\"402161002352\",\"text\":\"山西省农村信用社联合社\",\"title\":\"山西省农村信用社联合社\"},{\"value\":\"402261000004\",\"text\":\"黑龙江省农村信用社联合社\",\"title\":\"黑龙江省农村信用社联合社\"},{\"value\":\"320491000112\",\"text\":\"新郑郑银村镇银行\",\"title\":\"新郑郑银村镇银行\"},{\"value\":\"320308000015\",\"text\":\"江苏淮安光大村镇银行\",\"title\":\"江苏淮安光大村镇银行\"},{\"value\":\"314585070516\",\"text\":\"珠海农村商业银行\",\"title\":\"珠海农村商业银行\"},{\"value\":\"320491000112\",\"text\":\"新郑郑银村镇银行\",\"title\":\"新郑郑银村镇银行\"},{\"value\":\"402581090008\",\"text\":\"广东省农村信用社联合社\",\"title\":\"广东省农村信用社联合社\"},{\"value\":\"402191030166\",\"text\":\"内蒙古呼和浩特金谷农村商业银行\",\"title\":\"内蒙古呼和浩特金谷农村商业银行\"},{\"value\":\"402611099974\",\"text\":\"广西壮族自治区农村信用社联合社\",\"title\":\"广西壮族自治区农村信用社联合社\"}],\"timestamp\":1713497531761}"; + + Map resultMap = JsonUtils.parseObject(json, Map.class); + List list = (List)resultMap.get("result"); + List insertlist = new ArrayList(); + Map keyMap = new HashMap(); + int i = 0 ; + for(Map m : list) { + String value =(String)m.get("value"); + String text =(String)m.get("text"); + SysDictData sd = new SysDictData(); + + Object obj = keyMap.get(value); + + if(obj == null){ + sd.setDictValue(value); + sd.setDictLabel(text); + sd.setDictSort(i); + sd.setCreateTime(new Date()); + sd.setDictType("bank_list"); + sd.setListClass("default"); + sd.setIsDefault("N"); + + keyMap.put(value,""); + + insertlist.add(sd); + } + i++; + + } + + this.sysDictDataMapper.insertBatch(insertlist,10000); + + } + + @Test + public void testInsertByBo() { + +// String json = "{\"success\": true,\"message\": \"操作成功!\",\"code\": 200,\"result\": [{\"id\": \"1321641787514806274\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"电信服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048496324610\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"出租或出售网络元素\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048496324612\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电子数据和信息的传输及应用服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048496324613\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网接入服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048500518913\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播电视信号传输服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713217\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"卫星电视信号落地转接服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713218\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他增值电信服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787594498050\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"文化创意服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048517296130\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296131\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296132\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文印晒图服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296133\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296134\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"知识产权服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296135\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"影视、广播广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490434\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"报纸、杂志广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490435\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"灯箱广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490436\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"路牌广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490437\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"建筑物广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490438\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490439\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"流动广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490440\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684738\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告代理服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684739\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会议服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684740\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"展览服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567281041410\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"组织活动服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567591419905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺创作服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567914381313\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺表演服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568132485122\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺表演\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568463835138\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化比赛服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568690327554\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他文化艺术经纪代理\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568891654145\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网文化活动\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569063620610\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"档案管理\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569441107970\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会议展览服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569814401026\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育指导服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570154139649\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育训练服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570380632065\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育经纪人服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570556792833\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育活动服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570716176385\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育管理服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570946863106\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571127218177\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育比赛服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343098556139016193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:37:04\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1402568931805253633\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-06-09 18:11:06\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787607080962\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"邮政服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048487936005\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"函件寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936006\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"包裹寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936007\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他邮件寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936009\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"报刊发行服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048492130310\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"邮政代理服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029533210710017\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他邮政服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029533542060034\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础电信服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787607080963\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"物流辅助服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048525684741\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"机场服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684744\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空摄影\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879042\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空培训\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879043\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空测量\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879044\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空勘探\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879045\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空护林\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879047\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空降雨\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073349\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"铁路货运客运场站服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073350\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"道路货运客运场站服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073351\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞救助服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267654\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他仓储服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267655\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"装卸搬运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267656\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"收件服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048542461954\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"分拣服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048542461955\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"派送服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559802597378\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"运输组织服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029560201056258\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"收派服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561010556930\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他辅助服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561262215169\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"票务服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561690034178\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"客运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562117853186\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562398871553\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物装卸\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562616975361\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物中转服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562872827905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物配载服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563074154498\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物打包整理\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563309035522\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物保管\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563493584898\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航拍服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564324057089\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空播撒农药\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564558938114\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航道疏浚服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564726710273\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航道管理服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565091614722\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞救援服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565267775489\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565536210945\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"船舶移泊服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565733343233\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"船舶调度服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565976612866\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"车辆调度服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029566475735042\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"车辆挂运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343099169350430722\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:39:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"港口码头服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787611275265\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:50:28\",\"type\": \"1\",\"name\": \"现代服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048580210697\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他现代服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547353903105\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547513286657\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务推广费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547894968321\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"销售推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548461199361\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548754800641\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"音视频服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548914184193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务外包服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549174231041\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术外包服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549325225986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"洗车服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549492998145\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流装卸、搬运、包装服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549715296257\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流配送服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550008897537\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化创意策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550151503873\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550298304513\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销策划\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550432522242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550570934273\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场销售服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550776455170\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场拓展\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551036502018\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场售后服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551216857090\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551434960897\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551619510274\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"设计服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551816642562\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务信息咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551984414721\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务信息服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552147992578\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552265433090\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552429010946\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552630337538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"渠道搭建及使用\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552793915394\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"清障服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552890384386\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车装饰\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553104293889\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车美容\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553280454658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车检测服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553506947074\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"企业管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553725050882\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"培训服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553947348993\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"居民日常服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554131898370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"救援服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554362585089\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经济服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554639409154\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育信息咨询\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554853318658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家政服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555054645249\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家庭服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555318886401\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555562156033\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术交流\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555771871234\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"机动车公共停车管理服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556002557954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物运输代理服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556254216193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会展服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556417794050\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告制作费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556572983297\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556765921282\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"供应链外包\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556933693442\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:50:28\",\"type\": \"2\",\"name\": \"电梯等设备维保\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557151797250\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"道路救援\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557365706754\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理经纪服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557629947905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557789331457\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代驾服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557986463746\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代办年检\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558208761857\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"畜牧业技术咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558456225794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务顾问服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558657552385\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"保洁服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558858878978\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"(市场、网络等)渠道搭建及使用服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559022456834\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559148285953\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场推广服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559290892289\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场调查\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559550939137\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"维持秩序服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343109571966742529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:20:50\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343110414820544513\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:24:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343110783122378753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:25:39\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787611275266\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"鉴证咨询服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048550850564\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048550850565\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程监理服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048550850566\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"涉税鉴证\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044866\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"纳税情况审查\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044867\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"审计服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044868\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他鉴证服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044869\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"一般税务咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239169\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业税务顾问\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239170\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"税收策划\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239171\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他涉税服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239172\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会计服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239173\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会计咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239174\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"法律咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239175\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他咨询服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663873\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"生活服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048584404998\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584404999\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584405000\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"学历教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584405001\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"非学历教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599297\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育辅助服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599298\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599299\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"旅游服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599300\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"娱乐服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599301\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"餐饮服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599302\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"住宿服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599303\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"殡葬服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599304\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"养老服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793602\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"员工制家政服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793603\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"育养服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793604\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他居民日常服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793605\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他生活服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571324350466\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化娱乐经纪人服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571492122626\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业保洁、清洗、消毒服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571773140993\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"钟点服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571949301762\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"植物养护服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029572121268225\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"植物养护\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029572666527745\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"照料和护理服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573006266370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"养生保健服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573165649922\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"洗染服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573585080322\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化体育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574008705025\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"外卖递送服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574251974657\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育健康指导\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574415552514\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574600101890\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"摄影扩印服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574872731649\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"社会看护与帮助服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575065669634\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"庆典策划\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575472517121\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"旅游娱乐服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575845810178\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"临床检验服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576122634241\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"老年人、残疾人养护服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576344932353\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"居民服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576529481730\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576760168449\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"健康体检服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577179598850\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家居产品维保\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577338982402\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"活动策划\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577796161538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"外卖配送服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663874\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": \"yychenqiangming\",\"updateTime\": \"2022-07-18 17:34:19\",\"type\": \"1\",\"name\": \"研发和技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048504713219\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"研发服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713220\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"合同能源管理服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713221\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程勘察服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907521\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"矿产地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907522\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907523\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907524\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业技术服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663875\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"商务辅助服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048563433484\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048567627777\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他企业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048571822084\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理报关服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016385\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"婚姻介绍服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016386\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"纳税申报代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016387\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他税务事项代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210690\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"诉讼代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210691\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"非诉讼代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210692\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理记账\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210693\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他经纪代理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210694\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"劳务派遣服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210695\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他人力资源服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210696\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"安全保护服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029583378780161\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"职业中介服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029583634632705\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"企业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029584016314370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经纪代理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1402804841830416385\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-06-10 09:48:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663876\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"广播影视服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048559239176\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433474\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433475\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433476\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"音像制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433477\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433478\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433479\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433480\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433481\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433482\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"现场电影放映服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433483\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网电影播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029619453988865\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"制作费\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029619869224962\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620074745857\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620234129409\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)播映服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620653559809\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播电视集成播控\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620913606658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影摄制服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029621152681986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影放映\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787628052482\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"信息技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048508907525\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件开发服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907526\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907527\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101825\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他软件服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101826\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路设计服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101827\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101828\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"相关电路技术支持服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101829\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101830\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务流程管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296129\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统增值服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535530160129\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"桌面管理与维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535903453186\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"在线杀毒服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536180277249\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"虚拟主机服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536482267137\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统应用服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536696176642\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据库管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536893308929\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据存储服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537174327297\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据处理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537346293761\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据备份服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537568591874\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统容灾服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537803472898\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统集成服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537992216578\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统分析和整合服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538176765954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术咨询服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538373898242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术基础设施管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538675888129\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538873020417\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息安全服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539313422337\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流信息管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539523137538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539732852737\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站内容维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539946762242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站建设\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540139700225\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络运营服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540349415426\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540584296450\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"托管中心服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540814983169\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"推广服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541003726849\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"税务管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541163110402\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据中心服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541397991425\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据库维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541603512322\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据加密\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541783867393\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据恢复\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541985193985\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据处理和存储支持服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542152966146\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据备份\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542333321218\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"系统设计\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542517870594\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542777917441\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件外包服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543033769986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件开发费用\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543247679490\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件测试费\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543419645954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543746801666\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经营信息管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543948128257\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术转让\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544078151682\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术开发服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544317227010\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术服务费\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544547913729\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"计算机软件开发\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544778600450\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础信息技术管理平台整合服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544979927041\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"呼叫中心管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545172865026\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"供应链管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545369997313\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电子商务平台服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545600684034\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电商平台服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545831370753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路设计及测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546234023937\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"大数据分析\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546397601794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务经济管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546699591681\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件咨询服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547181936641\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网信息服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343108755432247298\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:17:36\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029524901793794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"咨询服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029525342195714\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场调查服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029525619019778\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526168473601\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526512406529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"管理咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526847950850\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"翻译服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527196078081\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"策划服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527376433153\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗咨询服务费\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527573565442\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗健康咨询服务费\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527762309122\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"一般咨询服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029533932130305\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:51:59\",\"type\": \"1\",\"name\": \"研发与技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029534469001217\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029534674522113\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"矿产地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029534863265794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535131701250\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:51:59\",\"type\": \"2\",\"name\": \"工程勘察勘探服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029609509294082\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": \"admin@songya\",\"updateTime\": \"2024-01-11 18:21:45\",\"type\": \"1\",\"name\": \"教育医疗服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029609752563714\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"招生服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029609907752962\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"考试服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029610109079553\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育信息咨询服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029610369126401\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育测评服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1744924304161181697\",\"createBy\": \"admin@songya\",\"createTime\": \"2024-01-10 11:29:08\",\"updateBy\": \"admin@songya\",\"updateTime\": \"2024-01-11 18:21:45\",\"type\": \"2\",\"name\": \"医疗服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029614076891138\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"鉴证服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029614190137345\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"质检技术服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614357909505\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流信息咨询服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614513098753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务咨询费\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614743785473\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证认可服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029615255490562\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程管理服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029615523926017\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务咨询\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029622457110529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"餐饮住宿服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1343101669654736897\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:49:26\",\"updateBy\": \"admin\",\"updateTime\": \"2020-12-27 16:38:05\",\"type\": \"1\",\"name\": \"文化体育服务\",\"parentId\": null,\"list\": [{\"id\": \"1343101790371000321\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:49:55\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114618586894338\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:40:54\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育指导服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114738829201409\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:41:22\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育训练服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114941946736642\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:42:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育活动服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115233178259458\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:43:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育管理服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115402657476609\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:44:01\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115600632844289\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:44:48\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115766676951042\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:45:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育比赛服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1377464354886131713\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-04-01 11:34:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"教育辅助服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1596068477544751105\",\"createBy\": \"yangquan\",\"createTime\": \"2022-11-25 17:09:13\",\"updateBy\": \"yangquan\",\"updateTime\": \"2022-11-25 17:09:50\",\"type\": \"1\",\"name\": \"人力资源服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1596069139343007746\",\"createBy\": \"yangquan\",\"createTime\": \"2022-11-25 17:11:51\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"文化服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"}],\"timestamp\": 1713423211831}"; + String json = ""; + Map resultMap = JsonUtils.parseObject(json, Map.class); + + List list = (List)resultMap.get("result"); + + long i = 1; + List insertList = new ArrayList(); + for(Map m : list){ + String name = (String)m.get("name"); + System.out.println(name); + SysIndustry sysIndustry = new SysIndustry(); + long id = IdUtil.getSnowflakeNextId(); + + sysIndustry.setId(id); + sysIndustry.setName(name); + sysIndustry.setParentId(0l); + sysIndustry.setIsUse(1); + sysIndustry.setLevel(1); + sysIndustry.setSort(i); + i = i+2; + sysIndustry.setCreateTime(new Date()); + insertList.add(sysIndustry); + List sublist = (List)m.get("list"); + + for (Map subM: sublist){ + String name1 = (String)subM.get("name"); + SysIndustry sysIndustry1 = new SysIndustry(); + long id1 = IdUtil.getSnowflakeNextId(); + sysIndustry1.setId(id1); + sysIndustry1.setName(name1); + sysIndustry1.setParentId(sysIndustry.getId()); + sysIndustry1.setIsUse(1); + sysIndustry1.setSort(i); + sysIndustry1.setLevel(2); + sysIndustry1.setCreateTime(new Date()); + insertList.add(sysIndustry1); + i = i + 2; + } + } + +// this.baseMapper.insertBatch(insertList,1000); + + + + // Arrange +// SysIndustry sysIndustry = new SysIndustry(); +// sysIndustry.setId(100L); +// when(baseMapper.insert(any(SysIndustry.class))).thenReturn(1); // Simulate successful insert +// +// // Act +// Boolean result = sysIndustryService.insertByBo(sysIndustryBo); +// +// // Assert +// assertTrue(result); +// verify(baseMapper, times(1)).insert(any(SysIndustry.class)); +// assertEquals(sysIndustryBo.getId(), sysIndustryBo.getId()); // Check if ID is set correctly + } + + + // Add more tests for edge cases and validation logic as needed... +}