提交 cb5118ae 作者: zhenjie

Merge branch 'develop'

......@@ -28,22 +28,20 @@ public class PayWalletDTO implements Serializable {
private String userName;
@ApiModelProperty(value = "云享金余额")
private BigDecimal cashAmt;
@ApiModelProperty(value = "已消耗云享金")
private BigDecimal cashPaid;
@ApiModelProperty(value = "云享金总金额")
private BigDecimal totalCash;
@ApiModelProperty(value = "已冻结云享金")
private BigDecimal cashFreeze;
@ApiModelProperty(value = "佣金余额")
private BigDecimal salaryAmt;
@ApiModelProperty(value = "已消耗佣金")
private BigDecimal salaryPaid;
@ApiModelProperty(value = "已冻结佣金")
private BigDecimal salaryFreeze;
@ApiModelProperty(value = "佣金总额度")
private BigDecimal totalSalary;
@ApiModelProperty(value = "已提现的金额")
private BigDecimal rebateWdl;
@ApiModelProperty(value = "提现冻结金额")
private BigDecimal wdlFreeze;
@ApiModelProperty(value = "冻结总额")
private BigDecimal totalFreeze;
@ApiModelProperty(value = "总金额")
......
package com.mmc.iuav.user.model.dto.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author 作者 lw
* @version 创建时间:2023.8.28 11:08:54
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WithdrawalApplyDTO implements Serializable {
private static final long serialVersionUID = -5782430067900145219L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "申请人的用户ID")
private Integer userAccountId;
@ApiModelProperty(value = "申请金额")
private BigDecimal applyAmt;
@ApiModelProperty(value = "申请状态: 0平台处理中 1提现成功 2提现失败")
private Integer applyStatus;
@ApiModelProperty(value = "开户人")
private String empName;
@ApiModelProperty(value = "开户银行-支行名称")
private String bankName;
@ApiModelProperty(value = "收款账号")
private String payAccount;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "流水编号")
private String outerTradeNo;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "提现方式-微信(wechat)-支付宝(alipay)-银行卡(bank_card)", required = true, example = "wechat")
private String settleType;
@ApiModelProperty(value = "处理信息")
private String tradeResult;
@ApiModelProperty(value = "apply 提现申请 await待发放 handle交易中 success 交易成功 failure 交易失败")
private String tradeStatus;
@ApiModelProperty(value = "创建时间")
private Date createTime;
}
package com.mmc.iuav.user.model.dto.xzsz;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @Author LW
* @date 2023/8/29 14:25
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UsableCashPoolingDTO {
@ApiModelProperty(value = "商户企业名称")
private String companyName;
@ApiModelProperty(value = "可用余额(含税费金额)")
private String taxFundName;
@ApiModelProperty(value = "税源地名称")
private BigDecimal availableBalance;
@ApiModelProperty(value = "交易渠道")
private String tradesChannel;
}
package com.mmc.iuav.user.model.fdd.dto;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author:zhenjie Date:2022/9/2
* time:14:34
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@ApiModel(value = "com.mmc.csf.fdd.dto.AppEVerifyInfoDTO", description = "小程序用户企业认证DTO")
public class FddVerifyInfoDTO implements Serializable {
private static final long serialVersionUID = 4194664180348523961L;
private Integer id;
private Integer userFddId;
private String customerId;
private String transactionNo;
private String url;
private Integer deleted;
private Date createTime;
private Date updateTime;
}
package com.mmc.iuav.user.model.fdd.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* author:zhenjie
* Date:2022/9/1
* time:15:53
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserFddDTO implements Serializable {
private static final long serialVersionUID = -4952516407490131779L;
private Integer id;
private String unionId;
private String customerId;
private Integer personVerifyStatus;
private Integer entVerifyStatus;
private Integer accountType;
private Date createTime;
private Date updateTime;
}
package com.mmc.iuav.user.model.fdd.req;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* author:zhenjie
* Date:2022/7/27
* time:14:29
*/
@Data
@NoArgsConstructor
public class NECertReq implements Serializable {
private static final long serialVersionUID = 6174142180495289363L;
private String name;
private String value;
}
package com.mmc.iuav.user.model.fdd.resp;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* author:zhenjie
* Date:2022/7/21
* time:18:13
*/
@Data
@NoArgsConstructor
public class CompanyVerifyResp implements Serializable {
private static final long serialVersionUID = 5835274401261039702L;
private String transactionNo;
private String url;
}
package com.mmc.iuav.user.model.fdd.resp;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* author:zhenjie
* Date:2022/7/18
* time:16:00
*/
@Data
@NoArgsConstructor
public class PersonVerifyResp implements Serializable {
private static final long serialVersionUID = 7583599952872411025L;
private String transactionNo;
private String url;
}
package com.mmc.iuav.user.model.fdd.seal;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author LW
* @date 2022/8/3 16:24
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SealDetail implements Serializable {
@ApiModelProperty(value = "签章图片Base64")
private String signatureImg;
@ApiModelProperty(value = "签章编号")
private String signatureId;
@ApiModelProperty(value = "签章图片作用范围:0:非默认 1:默认章")
private Integer signatureScope;
@ApiModelProperty(value = "签章来源 0:法大大生成 1:平台上传")
private String signatureSource;
@ApiModelProperty(value = "企业或者个人 1:个人 2:企业")
private String signatureType;
}
package com.mmc.iuav.user.model.qo.wallet;
import com.mmc.iuav.group.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author 作者 lw
* @version 创建时间:2023.8.26 上午11:40:21
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WalletFlowQO implements Serializable {
private static final long serialVersionUID = -2568266056802132237L;
@ApiModelProperty(value = "用户id", hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "查询年-月")
private String yearMonth;
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "结束时间", hidden = true)
private String endTime;
@ApiModelProperty(value = "状态类型")
private Integer payMethod;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = {Page.class})
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = {Page.class})
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
package com.mmc.iuav.user.model.qo.wallet;
/**
* @author 作者 geDuo
* @version 创建时间:2021年10月29日 下午2:25:08
* @explain 类说明
*/
import com.mmc.iuav.group.Freeze;
import com.mmc.iuav.group.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WithdrawalApplyQO implements Serializable {
private static final long serialVersionUID = -2185498289462506967L;
@ApiModelProperty(value = "关键字", example = "666")
private String keyword;
@ApiModelProperty(value = "开始时间", example = "2023-08-28 00:00:00")
private String startTime;
@ApiModelProperty(value = "结束时间", example = "2023-08-28 23:59:59")
private String endTime;
@ApiModelProperty(value = "状态: apply 提现申请 await待发放 handle交易中 success 交易成功 failure 交易失败", example = "0")
private String tradeStatus;
@ApiModelProperty(value = "通道标识-微信(wechat)-支付宝(alipay)-银行卡(bank_card)", required = true, example = "wechat")
private String settleType;
@ApiModelProperty(value = "页码", required = true, example = "1")
@NotNull(message = "页码不能为空", groups = {Page.class, Freeze.class})
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true, example = "10")
@NotNull(message = "每页显示数不能为空", groups = {Page.class, Freeze.class})
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
......@@ -73,4 +73,8 @@ public class UserAccountVO implements Serializable {
private Integer auditStatus;
@ApiModelProperty(value = "总积分 null表示无积分")
private Integer totalPoints;
@ApiModelProperty(value = "小猪算账电签状态:0否,1是")
private Integer xzAuthStatus;
@ApiModelProperty(value = "是否关注公众号")
private Integer subStatus;
}
package com.mmc.iuav.user.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author LW
* @date 2023/8/26 15:42
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WithdrawalInfoVO implements Serializable {
public final static String AMT = "amt";
public final static String APPLY = "APPLY";
private static final long serialVersionUID = 2535626170303302278L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "流水编号")
private String payNo;
@ApiModelProperty(value = "操作方式")
private Integer payMethod;
@ApiModelProperty(value = "佣金变动金额(正数入账,负数扣除)")
private BigDecimal salaryAmtPaid;
@ApiModelProperty(value = "操作时间")
private Date payTime;
@ApiModelProperty(value = "操作名称")
private String name;
}
......@@ -7,11 +7,9 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @author: zj
......@@ -26,60 +24,41 @@ public class WxMsgVO implements Serializable {
@ApiModelProperty(value = "用户id-仅适用云享飞客户端")
private Integer userAccountId;
@ApiModelProperty(value = "公众号的openId")
private String openId;
private String touser;
@ApiModelProperty(value = "unionId-全局通用")
private String unionId;
@ApiModelProperty(value = "模板id")
@NotNull(message = "模板id不能为空")
private String templemteId;
private String templateId;
@ApiModelProperty(value = "网页跳转连接")
private String url;
@ApiModelProperty(value = "小程序APPID")
private String wxAppltAppId;
private String wxAppletAppId;
@ApiModelProperty(value = "小程序跳转连接")
private String appletPath;
@ApiModelProperty(value = "标题")
private MsgData title;
@ApiModelProperty(value = "消息数组")
private List<MsgData> data;
@ApiModelProperty(value = "消息备注")
private MsgData remark;
@ApiModelProperty(value = "按照接口文档传数据")
private JSONObject dataObject;
public String buildMsgJson() {
JSONObject obj = new JSONObject();
obj.put("touser", this.openId);
obj.put("template_id", this.templemteId);
public String buildTemplateMsg() {
JSONObject msg = new JSONObject();
msg.put("touser", this.touser);
msg.put("template_id", this.templateId);
// 跳转页面
if (!StringUtils.isBlank(this.url)) {
obj.put("url", this.url);
msg.put("url", this.url);
}
if (!StringUtils.isBlank(this.wxAppltAppId) && !StringUtils.isBlank(this.appletPath)) {
// 跳转小程序页面设置
if (!StringUtils.isBlank(this.wxAppletAppId) && !StringUtils.isBlank(this.appletPath)) {
JSONObject mini = new JSONObject();
mini.put("appid", this.wxAppltAppId);
mini.put("appid", this.wxAppletAppId);
mini.put("pagepath", this.appletPath);
obj.put("miniprogram", mini);
}
JSONObject jd = new JSONObject();
jd.put("first", this.convertMsg(title));
if (!CollectionUtils.isEmpty(this.data)) {
for (int i = 0; i < data.size(); i++) {
String key = "keyword" + (i + 1);
jd.put(key, this.convertMsg(data.get(i)));
}
}
if (this.remark != null && !StringUtils.isBlank(this.remark.getValue())) {
jd.put("remark", this.convertMsg(this.remark));
msg.put("miniprogram", mini);
}
obj.put("data", jd);
return obj.toJSONString();
}
public JSONObject convertMsg(MsgData msg) {
JSONObject jb = new JSONObject();
jb.put("value", msg.getValue());
jb.put("color", msg.getColor());
return jb;
msg.put("data", this.dataObject);
return msg.toString();
}
}
package com.mmc.iuav.user.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/8/21 13:40
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class XzAuthVO implements Serializable {
private static final long serialVersionUID = -6009105206194794410L;
@ApiModelProperty(value = "用户名称")
private String username;
@ApiModelProperty(value = "身份证号")
private String idCardNo;
@ApiModelProperty(value = "手机号码")
private String mobile;
@ApiModelProperty(value = "附加信息,如需4要素认证必填")
private String bankAccount;
@ApiModelProperty(value = "身份证照片人像面URL,图片必须已经通过OCR识别")
private String idCardImageFront;
@ApiModelProperty(value = "身份证照片国徽面URL,图片必须已经通过OCR识别")
private String idCardImageBack;
}
package com.mmc.iuav.user.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/8/21 20:14
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class XzWithdrawalVO implements Serializable {
private static final long serialVersionUID = -8758847907824399671L;
@ApiModelProperty(value = "用户id")
private Integer userAccountId;
@ApiModelProperty(value = "回调地址")
private String notifyUrl;
@ApiModelProperty(value = "税源地id")
private String taxFundId;
@ApiModelProperty(value = "提现月份")
private String month;
@ApiModelProperty(value = "商户业务流水号(商户自行生成,全局唯一)")
private String outerTradeNo;
@ApiModelProperty(value = "自定义员工编号(商户系统中用户唯一编号)")
private String empNum;
@ApiModelProperty(value = "收款人户名")
private String empName;
@ApiModelProperty(value = "收款人手机号")
private String empPhone;
@ApiModelProperty(value = "收款人证件类型:ID_CARD")
private String licenseType;
@ApiModelProperty(value = "收款人证件号码")
private String licenseId;
@ApiModelProperty(value = "交易类型(bankcard:银行卡,alipay:支付宝,wechatpay:微信)")
private String settleType;
@ApiModelProperty(value = "收款账号,交易类型为支付宝时,为支付宝账号;交易类型为微信时,填收款用户的openid")
private String payAccount;
@ApiModelProperty(value = "收款人银行名称 (无需细到支行名称)")
private String bankName;
@ApiModelProperty(value = "服务类型,测试:销售推广;正式:市场推广")
private String positionName;
@ApiModelProperty(value = "交易金额(实际到账金额, 单位元,精确两位小数 )")
private Double payAmount;
@ApiModelProperty(value = "业务备注说明:若需要对每笔提现区分业务来源,可自行定义,后续可在SaaS后台查看,与用户到账说明无关(不能超过10个字)")
private String remarks;
@ApiModelProperty(value = "银行摘要备注(可在收款行交易明细中查看到")
private String bankRemo;
@ApiModelProperty(value = "商户自己的微信APPID,交易类型为微信时,必填")
private String wechatAppId;
}
package com.mmc.iuav.user.model.vo.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author: lw
* @Date: 2023/8/25 10:25
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApplyWithdrawalVO implements Serializable {
private static final long serialVersionUID = 8677383830415176214L;
@ApiModelProperty(value = "用户id")
private Integer userAccountId;
@ApiModelProperty(value = "户名")
private String empName;
@ApiModelProperty(value = "手机号")
private String empPhone;
@ApiModelProperty(value = "交易类型(bankcard:银行卡,alipay:支付宝,wechatpay:微信)", required = true)
private String settleType;
@ApiModelProperty(value = "收款账号,交易类型为支付宝时,为支付宝账号;交易类型为微信时,填收款用户的openid", required = true)
private String payAccount;
@ApiModelProperty(value = "收款人银行名称 (无需细到支行名称)")
private String bankName;
@ApiModelProperty(value = "服务类型,测试:销售推广;正式:市场推广", required = true)
private String positionName;
@ApiModelProperty(value = "交易金额(实际到账金额, 单位元,精确两位小数 )", required = true)
private BigDecimal payAmount;
}
package com.mmc.iuav.user.model.vo.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author 23214
* 飞手方钱包记录
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FlyerWalletFlowVO {
@ApiModelProperty(value = "用户ID")
private Integer userAccountId;
@ApiModelProperty(value = "支付方式 100(订单发布) 200(无人接单取消订单)300(有人接单取消订单)400(飞手抢单)500(客服判定飞手无责取消订单)600(飞手有责取消订单)700(正常结算)800(修改订单金额状态)900(飞手未确认修改金额状态)1000(飞手确认修改金额状态)")
private Integer modeOfPayment;
@ApiModelProperty(value = "云享金(需要正负)")
private BigDecimal cashAmount;
@ApiModelProperty(value = "佣金(需要正负)")
private BigDecimal salaryAmount;
@ApiModelProperty(value = "支付时间")
private Date timeOfPayment;
@ApiModelProperty(value = "操作者用户id")
private Integer operateUserAccountId;
@ApiModelProperty(value = "云享金违约金(需要正负)")
private BigDecimal yxjCashPledge;
@ApiModelProperty(value = "佣金违约金(需要正负)")
private BigDecimal salaryCashPledge;
@ApiModelProperty(value = "订单的百分比违约金(这笔钱是给发布方的)")
private BigDecimal percentagePenaltyOfOrder;
}
\ No newline at end of file
package com.mmc.iuav.user.model.vo.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author 23214
* 发布方钱包记录
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PublisherWalletFlowVO {
@ApiModelProperty(value = "用户ID")
private Integer userAccountId;
@ApiModelProperty(value = "支付方式 100(订单发布) 200(无人接单取消订单)300(有人接单取消订单)400(飞手抢单)500(客服判定飞手无责取消订单)" +
"600(飞手有责取消订单)700(正常结算)800(修改订单金额状态)900(飞手未确认修改金额状态)1000(飞手确认修改金额状态)")
private Integer modeOfPayment;
@ApiModelProperty(value = "云享金(需要正负)注:结算时修改金额如果大于原订单,需要支付的云享金,也传这个字段")
private BigDecimal cashAmount;
@ApiModelProperty(value = "佣金(需要正负)注:结算时修改金额如果大于原订单,需要支付的佣金,也传这个字段")
private BigDecimal salaryAmount;
@ApiModelProperty(value = "支付时间")
private Date timeOfPayment;
@ApiModelProperty(value = "操作者用户id")
private Integer operateUserAccountId;
@ApiModelProperty(value = "云享金违约金(需要正负)")
private BigDecimal yxjCashPledge;
@ApiModelProperty(value = "佣金违约金(需要正负)")
private BigDecimal salaryCashPledge;
@ApiModelProperty(value = "订单的百分比违约金(这笔钱是给飞手的) (需要正负)")
private BigDecimal percentagePenaltyOfOrder;
@ApiModelProperty(value = "加急单云享金金额 (需要正负)")
private BigDecimal urgentYxjAmount;
@ApiModelProperty(value = "加急单佣金金额 (需要正负)")
private BigDecimal urgentSalaryAmount;
@ApiModelProperty(value = "置顶单云享金金额 (需要正负)")
private BigDecimal topYxjAmount;
@ApiModelProperty(value = "置顶单佣金金额 (需要正负)")
private BigDecimal topSalaryAmount;
@ApiModelProperty(value = "飞手应得订单金额 (正数)")
private BigDecimal flyerSalaryAmount;
@ApiModelProperty(value = "修改后金额(注:①飞手未确认时,后面支付的需要退的佣金那部分钱 ②飞手确认时,修改后的金额小于原佣金,需要退多余的佣金那部分钱 ③如果全部是微信支付的则不用传值)")
private BigDecimal refundSalaryAmount;
@ApiModelProperty(value = "修改后金额(注:①飞手未确认时,后面支付的需要退的云享金那部分钱 ②飞手确认时,修改后的金额小于原佣金,需要退多余的云享金那部分钱 ③如果全部是微信支付的则不用传值)")
private BigDecimal refundCashAmount;
}
\ No newline at end of file
package com.mmc.iuav.user.model.vo.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author LW
* @date 2023/8/23 13:37
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TopUpOrderVO {
@ApiModelProperty(value = "支付用户的openid")
private String openid;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "金额(分)")
private Integer amount;
@ApiModelProperty(value = "订单状态")
private String tradeState;
@ApiModelProperty(value = "交易状态描述")
private String tradeStateDesc;
}
package com.mmc.iuav.user.model.vo.wallet;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author LW
* @date 2023/8/21 17:59
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WalletFlowVO implements Serializable {
private static final long serialVersionUID = -8848411142632397203L;
private PublisherWalletFlowVO publisherWalletFlowVO;
private FlyerWalletFlowVO flyerWalletFlowVO;
}
......@@ -9,6 +9,8 @@ public enum ResultEnum implements BaseErrorInfoInterface {
BODY_NOT_MATCH("400", "请求的数据格式不符"),
FAIL("500", "fail"),
PARAM_ERROR("400", "参数错误"),
REQUEST_PARAM_ILLEGAL_ERROR("706", "请求参数非法"),
NOT_FOUND("404", "未找到该资源!"),
//企业认证
BUSINESS_LICENSE_CHECK_ANALYSIS_ERROR("1000", "营业执照解析失败,请上传有效清晰的执照"),
......@@ -82,7 +84,12 @@ public enum ResultEnum implements BaseErrorInfoInterface {
WX_NOT_SEND_MSG_PARAM_ERROR("5029", "userId和openId至少一个不为空"),
APPLET_USER_ACCESS_TOKE_ERROR("5031", "获取accessToken签名校验失败"),
WX_NOT_REL_ERROR("5028", "获取微信公众号用户信息失败"),
DELETE_PASS_ERROR("5029", "已通过认证的不可删除");
DELETE_PASS_ERROR("5029", "已通过认证的不可删除"),
// 提现相关
WITHDRAWAL_APPLY_STATUS_ERROR("40001", "审批状态有误"),
WITHDRAWAL_INFO_NOT_FIND_ERROR("40002", "提现申请单信息不存在"),
WITHDRAWAL_REPEAT_CHECK_ERROR("40003", "提现申请单已被审批,切勿重复审批。");
/**
* 错误码
......
......@@ -85,6 +85,28 @@
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>com.mmc.iuav.cms</groupId>
<artifactId>piggy-settlement</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/piggy-settlement-sdk-1.7.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.mmc.csf.fdd</groupId>
<artifactId>self-innovate</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/fdd-verify-process-1.8.5.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.5</version>
</dependency>
</dependencies>
<build>
......@@ -92,6 +114,9 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
......
......@@ -37,4 +37,28 @@ public class UserSystemConstant {
@Value("${third-party.qcc.secret-key}")
private String qccSecretKey;
@Value("${third-party.xzsz.appKey}")
private String xzAppKey;
@Value("${third-party.xzsz.appSecret}")
private String xzAppSecret;
@Value("${third-party.xzsz.aes}")
private String xzAes;
@Value("${third-party.xzsz.domain}")
private String xzDomain;
@Value("${third-party.xzsz.position}")
private String xzPosition;
@Value("${third-party.xzsz.taxFundId}")
private String taxFundId;
@Value("${third-party.xzsz.authNotify}")
private String authNotify;
@Value("${third-party.xzsz.withdrawNotify}")
private String withdrawNotify;
}
package com.mmc.iuav.user.constant;
import org.springframework.stereotype.Component;
/**
* @author: zj
* @Date: 2023/5/16 16:02
......@@ -20,6 +18,7 @@ public class WxConstant {
public static final String IUAV_MINI_PROGRAM_ACCESS_TOKEN = "IUAV_MINI_PROGRAM_ACCESS_TOKEN";
public static final String IUAV_MINI_PROGRAM_STABLE_ACCESS_TOKEN = "IUAV_MINI_PROGRAM_STABLE_ACCESS_TOKEN";
public static final String SHARE_FLY_SUB_ACCESS_TOKEN = "SHARE_FLY_SUB_ACCESS_TOKEN";
public static final String SHARE_FLY_SUB_STABLE_ACCESS_TOKEN = "SHARE_FLY_SUB_STABLE_ACCESS_TOKEN";
}
package com.mmc.iuav.user.constant.fdd;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author:zhenjie Date:2022/7/16
* time:14:58
*/
@Component
public class FddConnectConstant {
public static String APP_ID;
public static String APP_KEY;
public static String VERSION;
public static String HOST;
public static String MMC_URL;
public FddConnectConstant(@Value("${fdd.appid}") String appid, @Value("${fdd.appkey}") String appkey,
@Value("${fdd.version}") String version, @Value("${fdd.host}") String host,
@Value("${fdd.mmc-url}") String mmcUrl) {
APP_ID = appid;
APP_KEY = appkey;
VERSION = version;
HOST = host;
MMC_URL = mmcUrl;
}
}
package com.mmc.iuav.user.constant.fdd;
import org.springframework.stereotype.Component;
/**
* author:zhenjie
* Date:2022/7/22
* time:11:07
*/
@Component
public class FddConstant {
public static final String CODE = "code";
public static final String DATA = "data";
public static final String SUCCESS = "1";
public static final String MSG = "msg";
public static final String SIGNATURE_ID = "signature_id";
public static final String UPLOAD_FILE = "uploadFile/";
//企业实名认证异步回调
// public static final String NOTIFY_E_CERT_RES = "fddservlet/fdd/notifyECertRes";
//企业实名认证同步回调
public static final String RETURN_E_CERT_RES = "fddservlet/fdd/returnECertRes";
//小程序企业实名认证异步回调
public static final String NOTIFY_E_CERT_RES = "fdd/notifyECertRes";
//签署合同异步回调
public static final String NOTIFY_STAMP = "fddservlet/contract/notifyStamp";
public static final String UAV_NOTIFY_STAMP = "fddservlet/uav/contract/notifyStamp";
public static final String APP_ID = "appId";
public static final String CUSTOMER_ID = "customerId";
public static final String STATUS = "status";
public static final String SERIAL_NO = "serialNo";
public static final String SIGN = "sign";
public static final String UID_REGEX = "[-|_]";
}
package com.mmc.iuav.user.controller;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.vo.WxMsgVO;
import com.mmc.iuav.user.service.WxService;
import com.mmc.iuav.user.util.WxApiUtil;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -48,6 +50,21 @@ public class WxController extends BaseController {
return ResultBody.success(wxService.createUrlLink(path, query));
}
@ApiOperation(value = "验证服务器URL是否有效")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@GetMapping("wxSendMessage")
public void checkService(@RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce,
@RequestParam String echostr, HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
System.out.println("#############验证服务器URL是否有效-START--################");
boolean bs = WxApiUtil.checkSignature(signature, timestamp, nonce);
System.out.println("输出:" + bs + "---" + echostr);
System.out.println("#############验证服务器URL是否有效-END--################");
out.println(bs ? echostr : null);
}
@ApiOperation(value = "监控微信公众号的事件变化通知", hidden = true)
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@PostMapping("wxSendMessage")
......@@ -60,10 +77,38 @@ public class WxController extends BaseController {
out.println(msg);
}
@ApiOperation(value = "发送消息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@PostMapping("send")
public ResultBody send(@RequestBody WxMsgVO ws) {
return wxService.sendSubTemplateMsg(ws);
}
@ApiOperation(value = "生成小程序码")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("getAppletQRCode")
public ResultBody getAppletQRCode(@ApiParam(value = "小程序路径", example = "pages/welcome/index") @RequestParam String page, @ApiParam(value = "参数", example = "name=123&sex=456") @RequestParam String scene) {
return wxService.getUnLimitedQRCode(page, scene);
}
@ApiOperation(value = "查询rid信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("rid")
public ResultBody rid(@RequestParam String rid) throws Exception {
return wxService.rid(rid);
}
@ApiOperation(value = "同步微信公众号用户")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("moveSubUserToTest")
public ResultBody moveSubUserToTest() {
return wxService.moveSubUserToTest();
}
@ApiOperation(value = "同步微信公众号用户unionId")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("moveSubUserUnionIdToTest")
public ResultBody moveSubUserUnionIdToTest() {
return wxService.moveSubUserUnionIdToTest();
}
}
package com.mmc.iuav.user.controller.fdd;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.controller.BaseController;
import com.mmc.iuav.user.model.fdd.dto.FddVerifyInfoDTO;
import com.mmc.iuav.user.model.fdd.dto.UserFddDTO;
import com.mmc.iuav.user.model.fdd.resp.CompanyVerifyResp;
import com.mmc.iuav.user.model.fdd.resp.PersonVerifyResp;
import com.mmc.iuav.user.service.fdd.UserFddAuthService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author:lw Date:2022/9/1
* time:15:44
*/
@Api(tags = {"fdd用户认证" })
@RestController
@RequestMapping("/fdd/")
public class UserFddAuthController extends BaseController {
@Autowired
private UserFddAuthService userFddAuthService;
@ApiOperation(value = "注册法大大账号")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = String.class)})
@ApiIgnore
@GetMapping("register")
public String register(@ApiParam(value = "唯一标识当类型为1的时候传openid 当为2的时候传id") @RequestParam String uid, @ApiParam(value = "账号类型 1个人 2企业") @RequestParam String accountType) {
return userFddAuthService.register(uid, accountType);
}
@ApiOperation(value = "获取个人实名认证地址")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = PersonVerifyResp.class)})
@GetMapping("getPersonVerifyUrl")
public ResultBody getPersonVerifyUrl(HttpServletRequest request) {
return userFddAuthService.getPersonVerifyUrl(this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
@ApiOperation(value = "获取企业实名认证url")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CompanyVerifyResp.class)})
@GetMapping("getCompanyVerifyUrl")
public ResultBody getCompanyVerifyUrl(@ApiParam(value = "端口:0小程序 1后台") @RequestParam Integer port, HttpServletRequest request) {
return userFddAuthService.getCompanyVerifyUrl(port, this.getUserLoginInfoFromRedis(request));
}
@ApiOperation(value = "异步处理企业实名认证")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@ApiIgnore
@PostMapping("notifyECertRes")
public ResultBody notifyECertRes(@RequestParam Map<String, String> map) {
return userFddAuthService.notifyECertRes(map);
}
@ApiOperation(value = "获取(企业/个人)实名认证信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = FddVerifyInfoDTO.class)})
@GetMapping("findCompanyCertInfo")
public ResultBody findCompanyCertInfo(@ApiParam(value = "端口:0小程序 1后台") @RequestParam Integer port, @ApiParam(value = "企业:2 个人:1") Integer flag, HttpServletRequest request) {
return userFddAuthService.findCompanyCertInfo(port, flag, this.getUserLoginInfoFromRedis(request));
}
@ApiOperation(value = "获取认证信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserFddDTO.class)})
@GetMapping("getAppUserFddInfo")
public ResultBody<UserFddDTO> getAppUserFddInfo(@ApiParam(value = "端口:0小程序 1后台") @RequestParam Integer port, HttpServletRequest request) {
return userFddAuthService.getAppUserFddInfo(port, this.getUserLoginInfoFromRedis(request));
}
@ApiOperation(value = "通过uuid下载文件")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("getFileByUuid")
public ResultBody getFileByUuid(@RequestParam String uuid, @RequestParam(required = false) String docType) {
return userFddAuthService.getFileByUuid(uuid, docType);
}
}
......@@ -2,14 +2,14 @@ package com.mmc.iuav.user.controller.wallet;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.controller.BaseController;
import com.mmc.iuav.user.entity.wallet.UserBillingDetailVO;
import com.mmc.iuav.user.model.dto.wallet.PayWalletDTO;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.vo.wallet.TopUpOrderVO;
import com.mmc.iuav.user.model.vo.wallet.WalletFlowVO;
import com.mmc.iuav.user.service.wallet.PayWalletService;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
......@@ -30,24 +30,51 @@ public class PayWalletController extends BaseController {
@ApiOperation(value = "获取当前用户消费(钱包)信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = PayWalletDTO.class)})
@GetMapping("getCurrentUserPayWalletInfo")
public ResultBody getCurrentUserPayWalletInfo(HttpServletRequest request) {
public ResultBody<PayWalletDTO> getCurrentUserPayWalletInfo(HttpServletRequest request) {
return payWalletService.getPayWalletInfo(this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
@ApiOperation(value = "获取用户消费(钱包)信息")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = PayWalletDTO.class)})
@GetMapping("getPayWalletInfo")
public ResultBody getPayWalletInfo(
public ResultBody<PayWalletDTO> getPayWalletInfo(
@ApiParam(value = "用户userAccountId", required = true) @RequestParam Integer userAccountId) {
return ResultBody.success(payWalletService.getPayWalletInfo(userAccountId));
}
@ApiOperation(value = "feign-初始化钱包")
@ApiOperation(value = "feign-云享金充值增加金额")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@ApiIgnore
@GetMapping("feignInitPayWallet")
public ResultBody feignInitPayWallet(@RequestParam Integer userAccountId) {
return payWalletService.initPayWallet(userAccountId);
@PostMapping("feignTopUpCash")
public ResultBody feignTopUpCash(@RequestBody TopUpOrderVO topUpOrderVO) {
return payWalletService.feignTopUpCash(topUpOrderVO);
}
@ApiOperation(value = "feign-钱包流水记录")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("feignWalletFlow")
public ResultBody feignWalletFlow(@RequestBody WalletFlowVO walletFlowVO) {
return payWalletService.feignWalletFlow(walletFlowVO);
}
@ApiOperation(value = "feign-钱包流水记录不带token")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("feignWalletFlowNO")
public ResultBody feignWalletFlowNO(@RequestBody WalletFlowVO walletFlowVO) {
return payWalletService.feignWalletFlow(walletFlowVO);
}
@ApiOperation(value = "用户账单明细")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserBillingDetailVO.class)})
@PostMapping("customerBillingDetail")
public ResultBody<UserBillingDetailVO> customerBillingDetail(HttpServletRequest request, @RequestBody WalletFlowQO walletFlowQO) {
return payWalletService.customerBillingDetail(this.getUserLoginInfoFromRedis(request).getUserAccountId(), walletFlowQO);
}
@ApiOperation(value = "账单详情")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserBillingDetailVO.class)})
@GetMapping("billingDetails")
public ResultBody<UserBillingDetailVO> billingDetails(@ApiParam(value = "ID", required = true) @RequestParam Integer id,
@ApiParam(value = "详情类型", required = true) @RequestParam String detailType) {
return payWalletService.billingDetails(id, detailType);
}
}
package com.mmc.iuav.user.controller.wallet;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.controller.BaseController;
import com.mmc.iuav.user.entity.wallet.UserBillingDetailVO;
import com.mmc.iuav.user.model.dto.wallet.WithdrawalApplyDTO;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.qo.wallet.WithdrawalApplyQO;
import com.mmc.iuav.user.model.vo.wallet.ApplyWithdrawalVO;
import com.mmc.iuav.user.service.xzsz.WithdrawalService;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
* @Date: 2023/8/23 15:58
*/
@Slf4j
@Api(tags = "提现相关")
@RequestMapping("/withdrawal/")
@RestController
public class WithdrawalController extends BaseController {
@Autowired
private WithdrawalService withdrawalService;
@ApiOperation(value = "提现申请")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("apply")
public ResultBody apply(@RequestBody ApplyWithdrawalVO applyWithdrawalVO, HttpServletRequest request) {
return withdrawalService.apply(applyWithdrawalVO, this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
// @ApiOperation(value = "个人提现明细列表-V1")
// @ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserBillingDetailVO.class)})
// @PostMapping("withdrawalList")
// public ResultBody<UserBillingDetailVO> withdrawalList(HttpServletRequest request, @RequestBody WalletFlowQO walletFlowQO) {
// return withdrawalService.withdrawalList(this.getUserLoginInfoFromRedis(request).getUserAccountId(), walletFlowQO);
// }
@ApiOperation(value = "个人提现明细列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserBillingDetailVO.class)})
@PostMapping("withdrawalList")
public ResultBody<UserBillingDetailVO> withdrawalList(HttpServletRequest request, @RequestBody WalletFlowQO walletFlowQO) {
return withdrawalService.withdrawalList(this.getUserLoginInfoFromRedis(request).getUserAccountId(), walletFlowQO);
}
@ApiOperation(value = "PC端-提现管理-分页查询")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = WithdrawalApplyDTO.class)})
@PostMapping("listPageWithdrawalApply")
public ResultBody<WithdrawalApplyDTO> listPageWithdrawalApply(
@ApiParam(value = "提现管理查询QO", required = true) @RequestBody WithdrawalApplyQO param) {
return ResultBody.success(withdrawalService.listPageWithdrawalApply(param));
}
@ApiOperation(value = "PC端-提现管理-审批")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("approveWithdrawalApply")
public ResultBody approveWithdrawalApply(@ApiParam(value = "申请单ID", required = true) @RequestParam Integer id,
@ApiParam(value = "状态: 0提现申请中 1审批通过 2审批未通过", required = true) @RequestParam Integer applyStatus,
@ApiParam(value = "备注") String remark,
HttpServletRequest request) {
return ResultBody.success(withdrawalService.approveWithdrawalApply(id, applyStatus, this.getUserLoginInfoFromRedis(request).getUserAccountId(), remark));
}
}
package com.mmc.iuav.user.controller.xzsz;
import cn.hutool.json.JSONObject;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.controller.BaseController;
import com.mmc.iuav.user.model.vo.XzAuthVO;
import com.mmc.iuav.user.model.vo.XzWithdrawalVO;
import com.mmc.iuav.user.service.xzsz.XzService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
* @Date: 2023/8/20 14:01
*/
@Slf4j
@Api(tags = "小猪算账api")
@RequestMapping("/xz/")
@RestController
public class XzController extends BaseController {
@Autowired
private XzService xzService;
@ApiOperation(value = "税源地公司信息查询-V2")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("getTaxFundList")
public ResultBody getTaxFundList() {
return xzService.getTaxFundList();
}
@ApiOperation(value = "资金池汇总余额查询-V2")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("getCashPooling")
public ResultBody getCashPooling() {
return xzService.getCashPooling();
}
@ApiOperation(value = "查询税源地可用资金-V2")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("getUsableCashPooling")
public ResultBody getUsableCashPooling() {
return ResultBody.success(xzService.getUsableCashPooling());
}
@ApiOperation(value = "签约状态查询")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("getContractScope")
public ResultBody getContractScope(@RequestBody XzAuthVO xzAuthVO) {
return ResultBody.success(xzService.getContractScope(xzAuthVO));
}
@ApiOperation(value = "发起合同签署")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("hasKeyByUrl")
public ResultBody hasKeyByUrl(HttpServletRequest request) {
return ResultBody.success(xzService.hasKeyByUrl(this.getUserLoginInfoFromRedis(request)));
}
@ApiOperation(value = "查询签署结果")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("getSignedResult")
public ResultBody getSignedResult(@RequestBody XzAuthVO xzAuthVO) {
return ResultBody.success(com.alibaba.fastjson2.JSONObject.toJSONString(xzService.getSignedResult(xzAuthVO)));
}
@ApiOperation(value = "在线浏览合同")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("viewContract")
public ResultBody viewContract(@RequestParam String documentId) {
return ResultBody.success(xzService.viewContract(documentId));
}
@ApiOperation(value = "刷脸数据删除")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("clearTestFace")
public ResultBody clearTestFace(@RequestParam String name, @RequestParam String idCard) {
return xzService.clearTestFace(name, idCard);
}
@ApiOperation(value = "特殊单笔提现上报")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("singleSubmitLimit")
public ResultBody singleSubmitLimit(@RequestBody XzWithdrawalVO xzWithdrawalVO) {
return ResultBody.success(xzService.singleSubmitLimit(xzWithdrawalVO));
}
@ApiOperation(value = "单笔提现上报")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("singleSubmit")
public ResultBody singleSubmit(@RequestBody XzWithdrawalVO xzWithdrawalVO) {
return ResultBody.success(xzService.singleSubmit(xzWithdrawalVO));
}
@ApiOperation(value = "查询提现结果")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("querySingleTrade")
public ResultBody querySingleTrade(@RequestParam String outerTradeNo) {
return ResultBody.success(xzService.querySingleTrade(outerTradeNo));
}
@ApiOperation(value = "查询单笔交易回单")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("querySingleReceipt")
public ResultBody querySingleReceipt(@RequestParam String frontLogNo) {
return xzService.querySingleReceipt(frontLogNo);
}
@ApiOperation(value = "签署结果回调")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("xzAuthNotify")
public String xzAuthNotify(@RequestBody JSONObject notify) {
return xzService.xzAuthNotify(notify);
}
@ApiOperation(value = "回调通知(单笔)")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("xzWithdrawNotify")
public String xzWithdrawNotify(@RequestBody JSONObject notify) {
return xzService.xzWithdrawNotify(notify);
}
}
......@@ -165,4 +165,7 @@ public interface UserServiceDao {
* @return
*/
List<UserAccountDO> getUserAccountByPhoneNum(String phoneNum);
UserAccountDO getUserAccountInfoByOpenId(String openid);
}
package com.mmc.iuav.user.dao.fdd;
import com.mmc.iuav.user.entity.fdd.FddVerifyInfoDO;
import com.mmc.iuav.user.entity.fdd.UserFddDO;
import org.apache.ibatis.annotations.Mapper;
/**
* author:zhenjie
* Date:2022/9/1
* time:15:46
*/
@Mapper
public interface UserFddAuthDao {
UserFddDO checkRegisterFdd(String unionId, Integer flag);
void insertAppUserFdd(UserFddDO userFddDO);
FddVerifyInfoDO getVerifyUrl(String customerId);
void insertVerifyInfo(FddVerifyInfoDO verifyInfoDO1);
void updateCompanyCertStatus(String customerId, String status);
UserFddDO getAppUserFddInfo(String unionId);
// void insertAppUserFdd(UserFddDO appUserFddDO1);
//
// AppEVerifyInfoDO getCompanyVerifyUrl(String customerId);
//
// void insertAppEVerifyInfo(AppEVerifyInfoDO appEVerifyInfoDO1);
//
// void updateCompanyCertStatus(String customerId, String status);
//
//
// List<UserFddDO> feignGetAppUserFddInfo(List<String> unionIds);
//
// UserFddDO getAppUserFddInfoByCustomerId(String customerId);
}
package com.mmc.iuav.user.dao.wallet;
import com.mmc.iuav.user.entity.XzWithdrawalApplyDO;
import com.mmc.iuav.user.entity.wallet.PayLogDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import com.mmc.iuav.user.entity.wallet.WithdrawalLogDO;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.qo.wallet.WithdrawalApplyQO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author LW
......@@ -13,4 +21,30 @@ public interface PayWalletDao {
PayWalletDO getPayWalletByUser(Integer userAccountId);
void insertPayWalletInfo(PayWalletDO wallet);
void insertPayLogDO(PayLogDO payWalletDO);
int updatePayWallet(PayWalletDO updatePayWallet);
List<PayLogDO> getPayLog(WalletFlowQO param);
int countPayLog(WalletFlowQO param);
PayLogDO getPayLogById(Integer id);
void insertWithdrawalLog(WithdrawalLogDO withdrawalLogDO);
List<XzWithdrawalApplyDO> getWithdrawalListByUserAccountId(WalletFlowQO param);
XzWithdrawalApplyDO getWithdrawalApplyByIdOrOuterTradeNo(@Param(value = "id") Integer id, @Param(value = "outerTradeNo") String outerTradeNo);
List<WithdrawalLogDO> listPayWithdrawalLog(Integer id);
int countPayWithdrawalLog(WalletFlowQO param);
int countWithdrawalApply(WithdrawalApplyQO param);
List<XzWithdrawalApplyDO> listPageWithdrawalApply(WithdrawalApplyQO param);
int updateWithdrawalApply(XzWithdrawalApplyDO apply);
}
package com.mmc.iuav.user.dao.xzsz;
import com.mmc.iuav.user.entity.XzWithdrawalApplyDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author: zj
* @Date: 2023/8/23 16:10
*/
@Mapper
public interface WithdrawalDao {
void insertWithdrawalApply(XzWithdrawalApplyDO xzWithdrawalApplyDO);
}
package com.mmc.iuav.user.dao.xzsz;
import com.mmc.iuav.user.entity.XzAuthDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author: zj
* @Date: 2023/8/21 16:24
*/
@Mapper
public interface XzDao {
int addAuth(XzAuthDO authDO);
XzAuthDO getXzAuthByUserAccountId(Integer userAccountId);
}
......@@ -44,6 +44,8 @@ public class UserAccountDO implements Serializable {
private Integer cityCode;
private Integer districtCode;
private Integer xzAuthStatus;
private Integer companyAuthStatus;
private String companyName;
private Integer leader;
......@@ -111,6 +113,7 @@ public class UserAccountDO implements Serializable {
.userRcdVO(this.userRcdDO == null ? null : this.userRcdDO.buildUserRcdVO())
.leader(this.leader)
.realNameAuthStatus(this.realNameAuthStatus)
.xzAuthStatus(this.xzAuthStatus)
.auditStatus(this.auditStatus)
.totalPoints(this.totalPoints)
.build();
......
package com.mmc.iuav.user.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/8/21 15:50
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class XzAuthDO implements Serializable {
private static final long serialVersionUID = 48590767645438311L;
private Integer id;
private Integer userAccountId;
private String name;
private String idCardNo;
private String mobile;
private String bankAccount;
private String subsidiary_name;
private String document_id;
private String customParams;
private String contract_url;
private Integer deleted;
private Date create_time;
private Integer xzAuthStatus;
}
package com.mmc.iuav.user.entity;
import com.mmc.iuav.user.entity.wallet.UserBillingDetailVO;
import com.mmc.iuav.user.enums.SettleTypeEnum;
import com.mmc.iuav.user.enums.XzEnums;
import com.mmc.iuav.user.model.dto.wallet.WithdrawalApplyDTO;
import com.mmc.iuav.user.model.vo.XzWithdrawalVO;
import com.mmc.iuav.user.model.vo.wallet.ApplyWithdrawalVO;
import com.mmc.iuav.user.util.PrivacyUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/8/23 16:17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class XzWithdrawalApplyDO implements Serializable {
private static final long serialVersionUID = 7891653696372539753L;
private Integer id;
private Integer userAccountId;
private Integer applyStatus;
private String bankName;
private String bankRemo;
private String empNum;
private String empName;
private String empPhone;
private String licenseId;
private String licenseType;
private String month;
private String notifyUrl;
private String outerTradeNo;
private String payAccount;
private Double payAmount;
private String positionName;
private String remarks;
private String settleType;
private String taxFundId;
private String wechatAppId;
private String tradeStatus;
private String tradeTime;
private String frontLogNo;
private String tradeFailCode;
private String tradeResult;
private String submitStatus;
private String errorCode;
private Date payTime;
private String errorMessage;
private BigDecimal chargeAmount;
private Date createTime;
private String remark;
private Integer approveUser;
private Date approveTime;
public XzWithdrawalApplyDO(XzWithdrawalVO xzWithdrawalVO) {
this.userAccountId = xzWithdrawalVO.getUserAccountId();
this.notifyUrl = xzWithdrawalVO.getNotifyUrl();
this.taxFundId = xzWithdrawalVO.getTaxFundId();
this.month = xzWithdrawalVO.getMonth();
this.outerTradeNo = xzWithdrawalVO.getOuterTradeNo();
this.empName = xzWithdrawalVO.getEmpName();
this.empPhone = xzWithdrawalVO.getEmpPhone();
this.empNum = xzWithdrawalVO.getEmpNum();
this.licenseId = xzWithdrawalVO.getLicenseId();
this.licenseType = xzWithdrawalVO.getLicenseType();
this.settleType = xzWithdrawalVO.getSettleType();
this.payAmount = xzWithdrawalVO.getPayAmount();
this.payAccount = xzWithdrawalVO.getSettleType().equals(SettleTypeEnum.BANK.getCode()) ?
xzWithdrawalVO.getPayAccount() : xzWithdrawalVO.getWechatAppId();
this.bankName = xzWithdrawalVO.getBankName();
this.positionName = xzWithdrawalVO.getPositionName();
this.remarks = xzWithdrawalVO.getRemarks();
this.bankRemo = xzWithdrawalVO.getBankRemo();
}
public XzWithdrawalApplyDO(ApplyWithdrawalVO applyWithdrawalVO) {
this.userAccountId = applyWithdrawalVO.getUserAccountId();
this.bankName = applyWithdrawalVO.getBankName();
this.settleType = applyWithdrawalVO.getSettleType();
this.payAccount = applyWithdrawalVO.getPayAccount();
this.positionName = applyWithdrawalVO.getPositionName();
this.payAmount = applyWithdrawalVO.getPayAmount().doubleValue();
}
public UserBillingDetailVO buildUserBillingDetailVO() {
payAccount = PrivacyUtil.encryptBankAcct(payAccount);
String name = "提现";
if (this.tradeStatus.equals(XzEnums.apply.getCode())) {
name = XzEnums.apply.getName();
} else if (this.tradeStatus.equals(XzEnums.await.getCode())) {
name = XzEnums.await.getName();
} else if (this.tradeStatus.equals(XzEnums.handle.getCode())) {
name = XzEnums.handle.getName();
} else if (this.tradeStatus.equals(XzEnums.failure.getCode())) {
name = XzEnums.failure.getName();
} else if (this.tradeStatus.equals(XzEnums.success.getCode())) {
name = XzEnums.success.getName();
} else if (this.applyStatus == 2) {
name = "提现审批未通过";
}
BigDecimal salaryAmtPaid;
if (this.tradeStatus.equals(XzEnums.failure.getCode()) || this.applyStatus == 2) {
salaryAmtPaid = new BigDecimal(payAmount);
} else {
salaryAmtPaid = new BigDecimal(payAmount).negate();
}
return UserBillingDetailVO.builder().userAccountId(userAccountId)
.payNo(outerTradeNo).payTime(payTime).account(payAccount).name(name).id(id)
.salaryAmtPaid(salaryAmtPaid).tradeResult(tradeResult).build();
}
public WithdrawalApplyDTO buildWithdrawalApplyDTO() {
return WithdrawalApplyDTO.builder().id(id).userAccountId(userAccountId).applyAmt(new BigDecimal(payAmount))
.applyStatus(applyStatus).empName(empName).bankName(bankName).payAccount(payAccount)
.remark(remark).outerTradeNo(outerTradeNo).tradeStatus(tradeStatus).phoneNum(empPhone).settleType(settleType)
.tradeResult(tradeResult).createTime(createTime).build();
}
}
package com.mmc.iuav.user.entity.fdd;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author:zhenjie Date:2022/7/22
* time:11:33
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FddVerifyInfoDO implements Serializable {
private static final long serialVersionUID = 7766546708723743143L;
private Integer id;
private Integer userFddId;
private String customerId;
private String transactionNo;
private String url;
private Integer deleted;
private Date createTime;
private Date updateTime;
}
package com.mmc.iuav.user.entity.fdd;
import com.mmc.iuav.user.model.fdd.dto.UserFddDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* author:zhenjie
* Date:2022/9/1
* time:15:51
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserFddDO implements Serializable {
private static final long serialVersionUID = -6432171445803296265L;
private Integer id;
private String unionId;
private String customerId;
private Integer personVerifyStatus;
private Integer entVerifyStatus;
private Integer accountType;
private Date createTime;
private Date updateTime;
public UserFddDTO buildUserFddDTO() {
return UserFddDTO.builder().id(this.id).unionId(this.unionId).customerId(this.customerId).personVerifyStatus(this.personVerifyStatus)
.entVerifyStatus(this.entVerifyStatus).accountType(this.accountType).createTime(this.createTime).updateTime(this.updateTime).build();
}
}
package com.mmc.iuav.user.entity.wallet;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -9,6 +14,9 @@ import java.util.Date;
* @author makejava
* @since 2023-08-18 16:18:01
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayLogDO implements Serializable {
private static final long serialVersionUID = 752682324297846133L;
......@@ -26,17 +34,18 @@ public class PayLogDO implements Serializable {
*/
private String payNo;
/**
* 0手动变更(大于0充值or小于0扣除) 100订单扣除 150订单冻结 200订单完成 250提现扣除
* 支付方式 100(订单发布) 200(无人接单取消订单)300(有人接单取消订单)400(飞手抢单)500(客服判定飞手无责取消订单)
* 600(飞手有责取消订单)700(正常结算)800(修改订单金额状态)900(飞手未确认修改金额状态)1000(飞手确认修改金额状态)1100(充值) 1200(提现)
*/
private Integer payMethod;
/**
* 云享金变动金额(正数充值,负数扣除)
*/
private Double cashAmtPaid;
private BigDecimal cashAmtPaid;
/**
* 佣金变动金额(正数入账,负数扣除)
*/
private Double salaryAmtPaid;
private BigDecimal salaryAmtPaid;
/**
* 支付时间
*/
......@@ -54,102 +63,12 @@ public class PayLogDO implements Serializable {
private Date updateTime;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserAccountId() {
return userAccountId;
}
public void setUserAccountId(Integer userAccountId) {
this.userAccountId = userAccountId;
}
public Integer getOrderNo() {
return orderNo;
}
public void setOrderNo(Integer orderNo) {
this.orderNo = orderNo;
}
public String getPayNo() {
return payNo;
}
public void setPayNo(String payNo) {
this.payNo = payNo;
}
public Integer getPayMethod() {
return payMethod;
}
public void setPayMethod(Integer payMethod) {
this.payMethod = payMethod;
}
public Double getCashAmtPaid() {
return cashAmtPaid;
}
public void setCashAmtPaid(Double cashAmtPaid) {
this.cashAmtPaid = cashAmtPaid;
}
public Double getSalaryAmtPaid() {
return salaryAmtPaid;
}
public void setSalaryAmtPaid(Double salaryAmtPaid) {
this.salaryAmtPaid = salaryAmtPaid;
}
public Date getPayTime() {
return payTime;
}
public void setPayTime(Date payTime) {
this.payTime = payTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getOperateUser() {
return operateUser;
}
public void setOperateUser(Integer operateUser) {
this.operateUser = operateUser;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
public UserBillingDetailVO buildUserBillingDetailVO() {
return UserBillingDetailVO.builder().userAccountId(userAccountId).payNo(payNo)
.payTime(payTime).payMethod(payMethod).cashAmtPaid(cashAmtPaid)
.salaryAmtPaid(salaryAmtPaid).name(name).id(id).build();
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
......@@ -53,6 +53,13 @@ public class PayWalletDO implements Serializable {
*/
private BigDecimal salaryFreeze;
private BigDecimal wxCashFreeze;
/**
* 提现冻结
*/
private BigDecimal wdlFreeze;
/**
* 提现总额
*/
......@@ -65,9 +72,8 @@ public class PayWalletDO implements Serializable {
public PayWalletDTO buildPayWalletDTO() {
return PayWalletDTO.builder().id(this.id).userAccountId(this.userAccountId)
.cashAmt(this.cashAmt).cashFreeze(this.cashFreeze)
.cashPaid(this.cashPaid).salaryAmt(this.salaryAmt)
.salaryFreeze(this.salaryFreeze).salaryPaid(this.salaryPaid)
.rebateWdl(this.salaryWdl).build();
.salaryAmt(this.salaryAmt).salaryFreeze(this.salaryFreeze.add(this.wdlFreeze))
.rebateWdl(this.salaryWdl).wdlFreeze(this.wdlFreeze).build();
}
public void defaultValue() {
......@@ -78,6 +84,7 @@ public class PayWalletDO implements Serializable {
this.salaryPaid = BigDecimal.ZERO;
this.salaryFreeze = BigDecimal.ZERO;
this.salaryWdl = BigDecimal.ZERO;
this.wxCashFreeze = BigDecimal.ZERO;
}
}
package com.mmc.iuav.user.entity.wallet;
import com.mmc.iuav.user.enums.RebateMethod;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author LW
* @date 2023/8/24 14:37
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserBillingDetailVO implements Serializable {
private static final long serialVersionUID = -113701726830167312L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "用户id")
private Integer userAccountId;
@ApiModelProperty(value = "流水编号")
private String payNo;
@ApiModelProperty(value = "操作方式")
private Integer payMethod;
@ApiModelProperty(value = "云享金变动金额(正数充值,负数扣除)")
private BigDecimal cashAmtPaid;
@ApiModelProperty(value = "佣金变动金额(正数入账,负数扣除)")
private BigDecimal salaryAmtPaid;
@ApiModelProperty(value = "操作时间")
private Date payTime;
@ApiModelProperty(value = "操作名称")
private String name;
@ApiModelProperty(value = "交易说明")
private String tradeResult;
@ApiModelProperty(value = "到账账户")
private String account;
@ApiModelProperty(value = "处理进度")
private List<Schedule> schedules;
public void buildSchedules(List<WithdrawalLogDO> list) {
this.schedules = new ArrayList<Schedule>();
for (WithdrawalLogDO d : list) {
if (RebateMethod.PENDING.getCode().equals(d.getPayMethod().toString())) {
Schedule sd = new Schedule();
sd.setTitle(RebateMethod.PENDING.getStatus());
sd.setAcTime(d.getPayTime());
sd.setActive(1);
this.schedules.add(sd);
} else if (RebateMethod.SUCCESS.getCode().equals(d.getPayMethod().toString())) {
Schedule sd = new Schedule();
sd.setTitle(RebateMethod.SUCCESS.getStatus());
sd.setAcTime(d.getPayTime());
sd.setActive(1);
this.schedules.add(sd);
} else if (RebateMethod.FAIL.getCode().equals(d.getPayMethod().toString())) {
Schedule sd = new Schedule();
sd.setTitle(RebateMethod.FAIL.getStatus());
sd.setAcTime(d.getPayTime());
sd.setActive(1);
this.schedules.add(sd);
}
}
if (this.schedules.size() == 1) {
Schedule sd = new Schedule();
sd.setTitle(RebateMethod.SUCCESS.getStatus());
sd.setActive(0);
this.schedules.add(sd);
}
}
public static class Schedule {
private String title;
private Date acTime;
private Integer active;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getAcTime() {
return acTime;
}
public void setAcTime(Date acTime) {
this.acTime = acTime;
}
public Integer getActive() {
return active;
}
public void setActive(Integer active) {
this.active = active;
}
}
}
package com.mmc.iuav.user.entity.wallet;
import com.mmc.iuav.user.enums.WithdrawalMethod;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* (WithdrawalLogDO)实体类
*
* @author makejava
* @since 2023-08-25 16:57:13
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WithdrawalLogDO implements Serializable {
private static final long serialVersionUID = 757884073681912750L;
private Integer id;
/**
* 用户id
*/
private Integer userAccountId;
/**
* 支付流水号(T202109031615XXXX)XXXX随机数
*/
private String payNo;
/**
* 150:提现冻结 200:提现成功 250:提现失败
*/
private Integer payMethod;
/**
* 流水时间
*/
private Date payTime;
/**
* 提现申请id
*/
private Integer xzWithdrawalApplyId;
private String typeName;
/**
* 提现冻结
*/
private BigDecimal salaryFreeze;
private BigDecimal salaryPaid;
private Date createTime;
private Date updateTime;
public UserBillingDetailVO buildUserBillingDetailVO() {
if (payMethod.equals(WithdrawalMethod.TXDJ.getCode())) {
this.typeName = WithdrawalMethod.TXDJ.getName();
}
if (payMethod.equals(WithdrawalMethod.TXCG.getCode())) {
this.typeName = WithdrawalMethod.TXCG.getName();
}
if (payMethod.equals(WithdrawalMethod.TXSB.getCode())) {
this.typeName = WithdrawalMethod.TXSB.getName();
}
return UserBillingDetailVO.builder().id(id).userAccountId(userAccountId)
.payMethod(payMethod).payTime(payTime).salaryAmtPaid(salaryFreeze == null ? salaryPaid : salaryFreeze)
.payNo(payNo).name(typeName).build();
}
}
package com.mmc.iuav.user.enums;
/**
* @Author LW
* @date 2023/8/19 18:53
* 概要:
*/
public enum PayMethodEnums {
PUBLISH_ORDER(100, "订单发布"),
CANCEL_ORDER_TAKING(200, "未接单时取消订单"),
RECEIVED_ORDER_CANCEL(300, "已接单取消订单"),
FLYING_ORDER_TAKING(400, "飞手抢单"),
CUSTOMER_SERVICE_CANCEL_ORDER(500, "客服判定飞手无责取消订单"),
FLYER_CANCEL_ORDER(600, "飞手有责取消订单"),
NORMAL_SETTLEMENT(700, "正常结算"),
MODIFY_THE_ORDER(800, "修改订单金额状态(大于)"),
FLYING_HAND_NOT_CONFIRMED_GT(900, "飞手未确认修改金额大于原订单状态"),
FLYING_HAND_CONFIRM_LT(1000, "飞手确认修改金额小于原订单状态"),
USER_TOP_UP(1100, "充值");
PayMethodEnums(Integer code, String method) {
this.code = code;
this.method = method;
}
private Integer code;
private String method;
public Integer getCode() {
return this.code;
}
public String getMethod() {
return this.method;
}
}
package com.mmc.iuav.user.enums;
/**
* @author 作者 lw
* @version 创建时间:2023.8.26 下午5:29:24
* @explain 类说明
*/
public enum RebateMethod {
PENDING("150", "提现申请"), SUCCESS("200", "提现到账"), FAIL("250", "提现失败");
RebateMethod(String code, String status) {
this.code = code;
this.status = status;
}
private String code;
private String status;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.iuav.user.enums;
/**
* @author: zj
* @Date: 2023/8/23 16:50
*/
public enum SettleTypeEnum {
ALIPAY("alipay", "支付宝"), WECHAT("wechatpay", "微信"), BANK("bankcard", "银行卡");
SettleTypeEnum(String code, String status) {
this.code = code;
this.status = status;
}
private String code;
private String status;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.iuav.user.enums;
/**
* @author 作者 geDuo
* @version 创建时间:2021年10月29日 下午2:43:14
* @explain 类说明
*/
public enum WithdrawalApplyStatus {
TXSQ(0, "提现申请中"), TXCG(1, "提现成功"), TXSB(2, "提现失败");
private Integer code;
private String name;
WithdrawalApplyStatus(Integer code, String name) {
this.code = code;
this.name = name;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getCode() {
return this.code;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
package com.mmc.iuav.user.enums;
/**
* @author 作者 LW
* @version 创建时间:2023.8.26 10:56
* @explain 类说明
*/
public enum WithdrawalMethod {
TXDJ(150, "提现冻结"), TXCG(200, "提现成功"), TXSB(250, "提现失败");
private Integer code;
private String name;
WithdrawalMethod(Integer code, String name) {
this.code = code;
this.name = name;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getCode() {
return this.code;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
package com.mmc.iuav.user.enums;
/**
* @author 作者 LW
* @version 创建时间:2023.8.26 10:56
* @explain 类说明
*/
public enum XzEnums {
submit_result("submitResult", "上报结果通知"), trade_result("tradeResult", "交易结果通知"),
await("await", "待发放"), handle("handle", "交易中"), success("success", "提现成功"),
failure("failure", "提现失败"), is_success("isSuccess", "交易是否成功"), T("T", "回调code"), F("F", "回调code"),
apply("apply", "提现申请"), cancel("cancel", "撤销"), pay("pay", "支付"), refund("refund", "退款");
private String code;
private String name;
XzEnums(String code, String name) {
this.code = code;
this.name = name;
}
public void setCode(String code) {
this.code = code;
}
public String getCode() {
return this.code;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
package com.mmc.iuav.user.mq;
import com.mmc.iuav.user.mq.constant.RabbitmqConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
......@@ -14,7 +15,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutExchangeConfig {
@Bean
public FanoutExchange fanoutExchange(){
public FanoutExchange fanoutExchange() {
return new FanoutExchange(RabbitmqConstant.USER_INFO_UPDATE_FANOUT_EXCHANGE);
}
......
package com.mmc.iuav.user.mq;
package com.mmc.iuav.user.mq.constant;
/**
* @author: zj
......@@ -8,4 +8,20 @@ public class RabbitmqConstant {
public final static String USER_INFO_UPDATE_FANOUT_EXCHANGE = "USER_INFO_UPDATE_FANOUT_EXCHANGE";
public final static String USER_INFO_UPDATE_FANOUT_FORUM_QUEUE = "USER_INFO_UPDATE_FANOUT_FORUM_QUEUE";
/**
* 用户充值订单交换机
*/
public final static String USER_TOP_UP_DIRECT_EXCHANGE = "USER_TOP_UP_DIRECT_EXCHANGE";
/**
* 充值订单队列、routing_key
*/
public final static String USER_TOP_UP_DIRECT_QUEUE = "USER_TOP_UP_DIRECT_QUEUE";
public final static String USER_TOP_UP_ROUTING_KEY = "USER_TOP_UP_ROUTING_KEY";
/**
* 充值成功队列、routing_key
*/
public final static String USER_TOP_UP_SUCCESS_QUEUE = "USER_TOP_UP_SUCCESS_QUEUE";
public final static String USER_TOP_UP_SUCCESS_ROUTING_KEY = "USER_TOP_UP_SUCCESS_ROUTING_KEY";
}
......@@ -3,7 +3,7 @@ package com.mmc.iuav.user.mq.impl;
import com.alibaba.fastjson2.JSONObject;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import com.mmc.iuav.user.mq.MqProducer;
import com.mmc.iuav.user.mq.RabbitmqConstant;
import com.mmc.iuav.user.mq.constant.RabbitmqConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
......
package com.mmc.iuav.user.mq.listener;
import com.alibaba.fastjson2.JSONObject;
import com.mmc.iuav.user.model.vo.wallet.TopUpOrderVO;
import com.mmc.iuav.user.mq.constant.RabbitmqConstant;
import com.mmc.iuav.user.service.wallet.PayWalletService;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @Author LW
* @date 2023/6/29 10:35 概要:
*/
@Slf4j
@Component
public class OrderMqConsumer {
@Resource
PayWalletService payWalletService;
@RabbitListener(queues = RabbitmqConstant.USER_TOP_UP_SUCCESS_QUEUE)
public void subscribeDirectQueue(@Payload String topUpOrder, Channel channel, Message message) {
TopUpOrderVO topUpOrderVO = JSONObject.parseObject(topUpOrder, TopUpOrderVO.class);
log.info("<==========用户充值成功消费开始:订单信息是---->{}==========>", topUpOrderVO);
payWalletService.feignTopUpCash(topUpOrderVO);
log.info("<==========用户充值成功消费结束==========>");
}
}
......@@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletRequest;
public interface WxService {
/**
* 小程序登录调用接口
*
* @param wxLoginVO
* @return
*/
......@@ -21,6 +22,7 @@ public interface WxService {
/**
* pc扫码登录
*
* @param wxLoginVO
* @return
*/
......@@ -28,36 +30,49 @@ public interface WxService {
/**
* 获取AccessToken
*
* @return
*/
String getAccessToken();
/**
* 获取稳定AccessToken
*
* @return
*/
String getStableAccessToken() throws Exception;
/**
* 获取公众号AccessToken
*
* @return
*/
String getSubAccessToken();
/**
* 获取公众号稳定版accessToken
*
* @return
*/
String getSubStableAccessToken();
/**
* 监控微信公众号的事件变化通知
*
* @param request
*/
String receiveSubAccountEvents(HttpServletRequest request);
/**
* 公众号推送模板消息-不需要用户同意
*
* @return
*/
ResultBody sendSubTemplateMsg(WxMsgVO ws);
/**
* 获取不限制的小程序码
*
* @param path
* @param scene
*/
......@@ -65,12 +80,14 @@ public interface WxService {
/**
* 小程序推送订阅号消息-需用户同意订阅
*
* @param appletMsgVO
*/
ResultBody sendAppletMsg(AppletMsgVO appletMsgVO);
/**
* 生成小程序链接
*
* @param path
* @param query
* @return
......@@ -85,4 +102,10 @@ public interface WxService {
* @return
*/
String getUserPhoneNumber(Integer id, String code);
ResultBody rid(String rid) throws Exception;
ResultBody moveSubUserToTest();
ResultBody moveSubUserUnionIdToTest();
}
package com.mmc.iuav.user.service.fdd;
/**
* author:zhenjie
* Date:2022/7/16
* time:15:30
*/
public interface FddService {
String register(String uid, String accountType);
String getApplyCert(String customerId, String transactionNo);
// ResultBody getFileByUuid(String uuid, String docType);
}
package com.mmc.iuav.user.service.fdd;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.fdd.dto.UserFddDTO;
import java.util.Map;
/**
* author:zhenjie
* Date:2022/9/1
* time:15:46
*/
public interface UserFddAuthService {
String register(String uid, String accountType);
ResultBody getPersonVerifyUrl(Integer userAccountId);
ResultBody getCompanyVerifyUrl(Integer port, LoginSuccessDTO loginSuccessDTO);
ResultBody notifyECertRes(Map<String, String> map);
ResultBody findCompanyCertInfo(Integer port, Integer flag, LoginSuccessDTO loginSuccessDTO);
String replaceUnableString(String uid);
ResultBody<UserFddDTO> getAppUserFddInfo(Integer port, LoginSuccessDTO loginSuccessDTO);
ResultBody getFileByUuid(String uuid, String docType);
// List<UserFddDTO> feignGetAppUserFddInfo(List<String> unionId);
}
package com.mmc.iuav.user.service.fdd.impl;
import com.alibaba.fastjson2.JSONObject;
import com.fadada.sdk.base.client.FddBaseClient;
import com.fadada.sdk.base.model.req.RegisterAccountParams;
import com.fadada.sdk.verify.client.FddVerifyClient;
import com.fadada.sdk.verify.model.req.ApplyCertParams;
import com.mmc.iuav.user.constant.fdd.FddConnectConstant;
import com.mmc.iuav.user.constant.fdd.FddConstant;
import com.mmc.iuav.user.dao.UserServiceDao;
import com.mmc.iuav.user.service.fdd.FddService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* author:zhenjie
* Date:2022/7/16
* time:15:30
*/
@Service
@Slf4j
public class FddServiceImpl implements FddService {
@Resource
UserServiceDao userServiceDao;
@Override
public String register(String uid, String accountType) {
FddBaseClient baseClient = new FddBaseClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
RegisterAccountParams params = new RegisterAccountParams();
//账号类型1个人 2企业
params.setAccountType(accountType);
//替换uid中包含的-或者_
String openId = uid.replaceAll("[-|_]", "");
//平台方自定义唯一标识
params.setOpenId(openId);
String result = baseClient.invokeRegisterAccount(params);
log.info(result);
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return null;
}
return JSONObject.parseObject(result).getString(FddConstant.DATA);
}
// @Override
// public ResultBody findPersonCertInfo(String verifiedSerialNo) {
// FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
// FindPersonCertParams params = new FindPersonCertParams();
// params.setVerifiedSerialNo(verifiedSerialNo); //此处填获取个人实名认证地址返回的交易号
// String result = client.invokeFindPersonCert(params);
// return ResultBody.success(result);
// }
//
// @Override
// public ResultBody getCompanyVerifyUrl(Integer userAccountId) {
// String customerId = this.checkRegisterFdd(userAccountId);
// if(customerId == null){
// return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
// }
// //查询原来有没有请求
// FddEVerifyInfoDO fddEVerifyInfo = fddVerifyDao.getFddEVerifyInfo(userAccountId);
// if(fddEVerifyInfo == null){
// CompanyVerifyResp companyVerifyResp = this.reqCompanyVerifyUrl(customerId);
// if(companyVerifyResp == null){
// return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
// }
// //保存实名认证链接和交易号
// FddEVerifyInfoDO fddEVerifyInfoDO = new FddEVerifyInfoDO();
// fddEVerifyInfoDO.setUserAccountId(userAccountId);
// fddEVerifyInfoDO.setCustomerId(customerId);
// fddEVerifyInfoDO.setTransactionNo(companyVerifyResp.getTransactionNo());
// fddEVerifyInfoDO.setUrl(companyVerifyResp.getUrl());
// fddVerifyDao.addFddEVerifyInfo(fddEVerifyInfoDO);
// return ResultBody.success(companyVerifyResp.getUrl());
// }
// return ResultBody.success(fddEVerifyInfo.getUrl());
// }
//
// private CompanyVerifyResp reqCompanyVerifyUrl(String customerId){
// FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
// CompanyVerifyUrlParams params = new CompanyVerifyUrlParams();
// params.setCustomerId(customerId);
// params.setPageModify("1");//1允许 2不允许 默认为1
// //设置回调通知
// params.setReturnUrl(FddConnectConstant.MMC_URL + FddConstant.RETURN_E_CERT_RES);
// params.setNotifyUrl(FddConnectConstant.MMC_URL + FddConstant.NOTIFY_E_CERT_RES);
// String result = client.invokeCompanyVerifyUrl(params);
// if(!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)){
// return null;
// }
// CompanyVerifyResp data = JSON.parseObject(JSONObject.parseObject(result).getString(FddConstant.DATA), CompanyVerifyResp.class);
// return data;
// }
@Override
public String getApplyCert(String customerId, String transactionNo) {
FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
ApplyCertParams params = new ApplyCertParams();
//客户编号
params.setCustomerId(customerId);
// 填写获取实名认证地址返回的交易号transactionNo
params.setVerifiedSerialNo(transactionNo);
String result = client.invokeApplyCert(params);
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return null;
}
return result;
}
// @Override
// public ResultBody findCompanyCertInfo(Integer userAccountId) {
// UserFddDO userFddDO = fddVerifyDao.getUserFddByUserAccountId(userAccountId);
// if(userFddDO == null){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// FddEVerifyInfoDO fddEVerifyInfo = fddVerifyDao.getFddEVerifyInfo(userAccountId);
// if( fddEVerifyInfo == null ){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
//
// FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
// FindCompanyCertParams params = new FindCompanyCertParams();
// params.setVerifiedSerialNo(fddEVerifyInfo.getTransactionNo());//此处填获取企业实名认证地址返回的交易号
// String result = client.invokeFindCompanyCert(params);
// if(!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// return ResultBody.success(JSONObject.parseObject(result).getString(FddConstant.DATA));
// }
//
// @Override
// public ResultBody notifyECertRes(String appId, String serialNo, String customerId, String status, String statusDesc, String certStatus, String authenticationType, String timestamp, String sign) {
// if (!appId.equals(FddConnectConstant.APP_ID)){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// //修改状态认证
// return userServletClient.notifyECertRes(appId, serialNo, customerId, status, statusDesc, certStatus, authenticationType, timestamp, sign);
// }
//
// @Override
// public ResultBody returnECertRes(String personName, String transactionNo, String authenticationType, String status, String sign) {
// //修改状态认证
// return userServletClient.returnECertRes(personName, transactionNo, authenticationType, status, sign);
// }
//
// @Override
// public ResultBody newNotifyECertRes(Map<String, String> map) {
//
// String appId = map.get("appId");
//// String name="%E9%83%AD%E5%AE%B6%E8%BE%89";
// String serialNo = map.get("serialNo");
// String customerId = map.get("customerId");
// String status = map.get("status");
// String statusDesc = map.get("statusDesc");
// String certStatus = map.get("certStatus");
// String authenticationType = map.get("authenticationType");
// String timestamp = map.get("timestamp");
// String sign = map.get("sign");
// String sha1 = FddEncryptTool.sha1(FddConnectConstant.APP_KEY +authenticationType +certStatus+customerId+ serialNo+status+ statusDesc);
// try {
// String md5 = FddEncryptTool.md5Digest(timestamp);
// String outSha1 = FddEncryptTool.sha1(FddConnectConstant.APP_ID+md5 + sha1);
// String base64 = new String(FddEncryptTool.Base64Encode(outSha1.getBytes())).trim();
// if(!base64.equals(sign)){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// if (!appId.equals(FddConnectConstant.APP_ID)){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// }catch (Exception e){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// FddEVerifyInfoDO fddEVerifyInfo = fddVerifyDao.getFddEVerifyInfoByTransactionNo(serialNo);
// if(fddEVerifyInfo == null){
// return ResultBody.error(ResultEnum.NOT_FOUND);
// }
// //修改认证状态
// fddVerifyDao.updateCompanyCertStatus(customerId, status);
// //通过需要申请证书
// if(status.equals("4")){
// this.getApplyCert(fddEVerifyInfo.getCustomerId(), fddEVerifyInfo.getTransactionNo());
// }
// return ResultBody.success();
// }
//
// @Override
// public ResultBody getUserFddInfo(Integer id) {
// UserFddDO userFddDO = fddVerifyDao.getUserFddByUserAccountId(id);
// if(userFddDO == null){
// return ResultBody.error(ResultEnum.NO_REAL_NAME);
// }
// return ResultBody.success(userFddDO.buildUserFddDTO());
// }
//
// @Override
// public List<UserFddDTO> feignBatchUserFddPage(List<Integer> list) {
// if( list.size() == 0 ){
// return null;
// }
// List<UserFddDO> userFddDOList = fddVerifyDao.listUserFddPage(list);
// List<UserFddDTO> collect = userFddDOList.stream().map(d -> {
// return d.buildUserFddDTO();
// }).collect(Collectors.toList());
// return collect;
// }
//
// @Override
// public ResultBody getFileByUuid(String uuid, String docType) {
// FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
// FileForUUIDParams params = new FileForUUIDParams();
// params.setUuid(uuid);//此处传个人实名认证接口查询中返回的认证图片id,或查询企业认证信息中返回 的企业认证申请表id
// params.setDocType(docType);//0:图片(默认图片)1:pdf (仅支持企业申请表模板)
// String result = client.invokeFileForUUID(params);
// //防止被转移,把字符串转base64
// String base64 = new String(FddEncryptTool.Base64Encode(result.getBytes())).trim();
// return ResultBody.success(base64);
// }
//
// /**
// * 查询是否注册法大大
// */
// private String checkRegisterFdd(Integer userAccountId){
// UserAccountDTO userAccountDTO = userServletClient.feignGetUserSimpleInfo(userAccountId);
// UserFddDO userFddDO = fddVerifyDao.getUserFddByUserAccountId(userAccountId);
// String customerId = null;
// if(userFddDO == null){
// //账号类型1个人 2企业,合伙人默认全部是企业
// Integer accountType = 2;
// customerId = this.register(userAccountDTO.getUid(), accountType+"");
// if(customerId == null){
// return null;
// }
// UserFddDO userFddDO1 = new UserFddDO();
// userFddDO1.setUserAccountId(userAccountId);
// userFddDO1.setCustomerId(customerId);
// userFddDO1.setAccountType(accountType);
// userFddDO1.setPersonVerifyStatus(0);
// userFddDO1.setEntVerifyStatus(0);
// fddVerifyDao.addUserFdd(userFddDO1);
// }else {
// customerId = userFddDO.getCustomerId();
// }
// return customerId;
// }
}
\ No newline at end of file
package com.mmc.iuav.user.service.fdd.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.fadada.sdk.utils.crypt.FddEncryptTool;
import com.fadada.sdk.verify.client.FddVerifyClient;
import com.fadada.sdk.verify.model.req.*;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.constant.fdd.FddConnectConstant;
import com.mmc.iuav.user.constant.fdd.FddConstant;
import com.mmc.iuav.user.dao.UserServiceDao;
import com.mmc.iuav.user.dao.fdd.UserFddAuthDao;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.entity.fdd.FddVerifyInfoDO;
import com.mmc.iuav.user.entity.fdd.UserFddDO;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.fdd.resp.CompanyVerifyResp;
import com.mmc.iuav.user.model.fdd.resp.PersonVerifyResp;
import com.mmc.iuav.user.service.fdd.FddService;
import com.mmc.iuav.user.service.fdd.UserFddAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
/**
* author:zhenjie
* Date:2022/9/1
* time:15:46
*/
@Service
public class UserFddAuthServiceImpl implements UserFddAuthService {
@Autowired
private FddService fddService;
@Resource
private UserServiceDao userServiceDao;
@Autowired
private UserFddAuthDao userFddAuthDao;
@Override
public String register(String uid, String accountType) {
return fddService.register(uid, accountType);
}
@Override
public ResultBody getPersonVerifyUrl(Integer userAccountId) {
UserAccountDO userInfo = userServiceDao.getUserAccountById(userAccountId);
String unionId = this.replaceUnableString(userInfo.getUnionId());
//验证是否注册个人
String customerId = this.checkRegisterFdd(unionId, 1);
if (customerId == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
UserFddDO userFddDO = userFddAuthDao.checkRegisterFdd(unionId, 1);
if (userFddDO == null) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
//查看原来是否有申请
FddVerifyInfoDO verifyInfoDO = userFddAuthDao.getVerifyUrl(userFddDO.getCustomerId());
if (verifyInfoDO == null) {
PersonVerifyResp personVerifyResp = this.getPersonVerifyUrl(customerId);
if (personVerifyResp == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
FddVerifyInfoDO verifyInfoDO1 = new FddVerifyInfoDO();
verifyInfoDO1.setUserFddId(userFddDO.getId());
verifyInfoDO1.setCustomerId(customerId);
verifyInfoDO1.setTransactionNo(personVerifyResp.getTransactionNo());
verifyInfoDO1.setUrl(personVerifyResp.getUrl());
userFddAuthDao.insertVerifyInfo(verifyInfoDO1);
return ResultBody.success(personVerifyResp.getUrl());
}
return ResultBody.success(verifyInfoDO.getUrl());
}
public PersonVerifyResp getPersonVerifyUrl(String customerId) {
FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
PersonVerifyUrlParams params = new PersonVerifyUrlParams();
params.setCustomerId(customerId); //客户编号
params.setVerifiedWay("0"); //实名认证套餐类型
params.setPageModify("1"); //是否允许用户页面修改 1允许 2不允许
// 以下是非必填参数
params.setNotifyUrl(FddConnectConstant.MMC_URL + FddConstant.NOTIFY_E_CERT_RES); //异步回调地址
// params.setReturnUrl(""); //同步通知url
// params.setCustomerName(""); //姓名
// params.setCustomerIdentType(""); //证件类型
// params.setCustomerIdentNo(""); //证件号码
// params.setMobile(""); //手机号码
// params.setIdentFrontPath(""); //证件正面照下载地址
// params.setIdentBackPath(""); //证件反面照下载地址
// params.setResultType(""); //刷脸是否显示结果页面
// params.setCertFlag(""); //是否认证成功后自动申请实名证书
// params.setCertType(""); //证件类型
// params.setBankCardNo(""); //个人银行卡
// params.setOption(""); //不传默认add
// params.setIdPhotoOptional(""); //是否需要上传身份照片
// params.setIsMinProgram(""); //是否跳转法大大公证处小程序认证
// params.setLang("zh"); //zh:中文;en:英文
// params.setIsAllowOverseasBankCardAuth(""); //海外用户是否支持银行卡认证
// params.setIdentFrontImg(new File("")); //证件正面照图片文件
// params.setIdentBackImg(new File("")); //证件反面照图片文件
String result = client.invokePersonVerifyUrl(params);
if (!com.alibaba.fastjson.JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return null;
}
PersonVerifyResp data = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson.JSONObject.parseObject(result).getString(FddConstant.DATA), PersonVerifyResp.class);
return data;
}
@Override
public ResultBody getCompanyVerifyUrl(Integer port, LoginSuccessDTO loginSuccessDTO) {
String uId;
if (port.equals(0)) {
// 获取小程序用户信息拿到unionId
UserAccountDO userInfo = userServiceDao.getUserAccountById(loginSuccessDTO.getUserAccountId());
uId = this.replaceUnableString(userInfo.getUnionId());
} else {
uId = loginSuccessDTO.getUserAccountId().toString();
}
//验证是否注册企业
String customerId = this.checkRegisterFdd(uId, 2);
if (customerId == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
UserFddDO userFddDO = userFddAuthDao.checkRegisterFdd(uId, 2);
if (userFddDO == null) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
//查看原来是否有申请
FddVerifyInfoDO verifyInfoDO = userFddAuthDao.getVerifyUrl(userFddDO.getCustomerId());
if (verifyInfoDO == null) {
CompanyVerifyResp companyVerifyResp = this.reqCompanyVerifyUrl(customerId);
if (companyVerifyResp == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
FddVerifyInfoDO verifyInfoDO1 = new FddVerifyInfoDO();
verifyInfoDO1.setUserFddId(userFddDO.getId());
verifyInfoDO1.setCustomerId(customerId);
verifyInfoDO1.setTransactionNo(companyVerifyResp.getTransactionNo());
verifyInfoDO1.setUrl(companyVerifyResp.getUrl());
userFddAuthDao.insertVerifyInfo(verifyInfoDO1);
return ResultBody.success(companyVerifyResp.getUrl());
}
return ResultBody.success(verifyInfoDO.getUrl());
}
@Override
public ResultBody notifyECertRes(Map<String, String> map) {
String appId = map.get("appId");
String serialNo = map.get("serialNo");
String customerId = map.get("customerId");
String status = map.get("status");
String statusDesc = map.get("statusDesc");
String certStatus = map.get("certStatus");
String authenticationType = map.get("authenticationType");
String timestamp = map.get("timestamp");
String sign = map.get("sign");
String sha1 = FddEncryptTool.sha1(FddConnectConstant.APP_KEY + authenticationType + certStatus + customerId + serialNo + status + statusDesc);
try {
String md5 = FddEncryptTool.md5Digest(timestamp);
String outSha1 = FddEncryptTool.sha1(FddConnectConstant.APP_ID + md5 + sha1);
String base64 = new String(FddEncryptTool.Base64Encode(outSha1.getBytes())).trim();
if (!base64.equals(sign)) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
if (!appId.equals(FddConnectConstant.APP_ID)) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
} catch (Exception e) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
FddVerifyInfoDO verifyInfoDO = userFddAuthDao.getVerifyUrl(customerId);
if (verifyInfoDO == null) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
//修改认证状态
userFddAuthDao.updateCompanyCertStatus(customerId, status);
//通过需要申请证书
if ((authenticationType.equals("2") && status.equals("4")) || (authenticationType.equals("1") && status.equals("2"))) {
fddService.getApplyCert(verifyInfoDO.getCustomerId(), verifyInfoDO.getTransactionNo());
}
return ResultBody.success();
}
@Override
public ResultBody findCompanyCertInfo(Integer port, Integer flag, LoginSuccessDTO loginSuccessDTO) {
String uId;
String result;
if (port.equals(0)) {
UserAccountDO userInfo = userServiceDao.getUserAccountById(loginSuccessDTO.getUserAccountId());
uId = this.replaceUnableString(userInfo.getUnionId());
} else {
uId = loginSuccessDTO.getUserAccountId().toString();
}
UserFddDO appUserFddDO = userFddAuthDao.checkRegisterFdd(uId, flag);
if (appUserFddDO == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
FddVerifyInfoDO fddVerifyInfoDO = userFddAuthDao.getVerifyUrl(appUserFddDO.getCustomerId());
if (fddVerifyInfoDO == null) {
return ResultBody.error(ResultEnum.REQUEST_PARAM_ILLEGAL_ERROR);
}
FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
if (flag.equals(2)) {
FindCompanyCertParams params = new FindCompanyCertParams();
//此处填获取企业实名认证地址返回的交易号
params.setVerifiedSerialNo(fddVerifyInfoDO.getTransactionNo());
result = client.invokeFindCompanyCert(params);
} else {
FindPersonCertParams params = new FindPersonCertParams();
//此处填获取个人实名认证地址返回的交易号
params.setVerifiedSerialNo(fddVerifyInfoDO.getTransactionNo());
result = client.invokeFindPersonCert(params);
}
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return ResultBody.error(ResultEnum.NOT_FOUND);
}
return ResultBody.success(JSONObject.parseObject(result).getString(FddConstant.DATA));
}
@Override
public ResultBody getAppUserFddInfo(Integer port, LoginSuccessDTO loginSuccessDTO) {
String uId;
if (port == 0) {
UserAccountDO userInfo = userServiceDao.getUserAccountById(loginSuccessDTO.getUserAccountId());
uId = this.replaceUnableString(userInfo.getUnionId());
} else {
uId = loginSuccessDTO.getUserAccountId().toString();
}
UserFddDO appUserFddDO = userFddAuthDao.getAppUserFddInfo(uId);
return ResultBody.success(appUserFddDO == null ? null : appUserFddDO.buildUserFddDTO());
}
private CompanyVerifyResp reqCompanyVerifyUrl(String customerId) {
FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
CompanyVerifyUrlParams params = new CompanyVerifyUrlParams();
params.setCustomerId(customerId);
params.setPageModify("1");//1允许 2不允许 默认为1
//设置回调通知
params.setNotifyUrl(FddConnectConstant.MMC_URL + FddConstant.NOTIFY_E_CERT_RES);
params.setMVerifiedWay("4");
String result = client.invokeCompanyVerifyUrl(params);
if (!JSONObject.parseObject(result).getString(FddConstant.CODE).equals(FddConstant.SUCCESS)) {
return null;
}
CompanyVerifyResp data = JSON.parseObject(JSONObject.parseObject(result).getString(FddConstant.DATA), CompanyVerifyResp.class);
return data;
}
private String checkRegisterFdd(String unionId, Integer flag) {
//查看是否已注册
UserFddDO userFddDO = userFddAuthDao.checkRegisterFdd(unionId, flag);
String customerId;
if (userFddDO == null) {
//账号类型1个人 2企业
customerId = this.register(unionId, flag.toString());
if (customerId == null) {
return null;
}
UserFddDO userFdd = new UserFddDO();
userFdd.setUnionId(unionId);
userFdd.setCustomerId(customerId);
userFdd.setAccountType(flag);
userFdd.setEntVerifyStatus(0);
userFdd.setPersonVerifyStatus(0);
userFddAuthDao.insertAppUserFdd(userFdd);
} else {
customerId = userFddDO.getCustomerId();
}
return customerId;
}
//
@Override
public String replaceUnableString(String uid) {
String u = uid.replaceAll(FddConstant.UID_REGEX, "");
return u;
}
@Override
public ResultBody getFileByUuid(String uuid, String docType) {
FddVerifyClient client = new FddVerifyClient(FddConnectConstant.APP_ID, FddConnectConstant.APP_KEY, FddConnectConstant.VERSION, FddConnectConstant.HOST);
FileForUUIDParams params = new FileForUUIDParams();
//此处传个人实名认证接口查询中返回的认证图片id,或查询企业认证信息中返回 的企业认证申请表id
params.setUuid(uuid);
//0:图片(默认图片)1:pdf (仅支持企业申请表模板)
params.setDocType(docType);
String result = client.invokeFileForUUID(params);
//防止被转移,把字符串转base64
String base64 = new String(FddEncryptTool.Base64Encode(result.getBytes())).trim();
return ResultBody.success(base64);
}
}
......@@ -18,6 +18,7 @@ import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.qo.LoginUserQO;
import com.mmc.iuav.user.model.vo.*;
import com.mmc.iuav.user.service.*;
import com.mmc.iuav.user.service.wallet.PayWalletService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -25,6 +26,7 @@ import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;
......@@ -66,8 +68,12 @@ public class AuthServiceImpl implements AuthService {
@Autowired
private AuthHandler authHandler;
@Resource
private PayWalletService payWalletService;
@Transactional
@Override
public ResultBody appletLogin(WxLoginVO wxLoginVO) {
String unionId;
String openId;
......@@ -101,6 +107,8 @@ public class AuthServiceImpl implements AuthService {
userAccountDO.setSource(wxLoginVO.getSource());
userAccountService.insertUserAccount(userAccountDO);
userAccountVO = userAccountDO.buildUserAccountVO();
// 创建用户钱包
payWalletService.initPayWallet(userAccountDO.getId());
payClient.createWallet(userAccountDO.getId());
// 查询之前有没有实名过
RealNameAuthDO nameAuthByUnionId = realNameAuthDao.getRealNameAuthBakByUnionId(unionId);
......
......@@ -162,7 +162,6 @@ public class BackUserAccountServiceImpl implements BackUserAccountService {
if (companyInfoVO != null && companyInfoVO.getCompanyType().equals(CompanyTypeEnums.FRANCHISEE.getType())) {
// 加盟企业的账号,需要把对应的成员和后台账号解绑
companyService.unbindingAllUsers(companyInfoVO.getId());
companyService.deleteCompanyInfoById(companyInfoVO.getId());
}
String accountNo = "DISABLE_" + backUserAccountDO.getAccountNo() + RandomStringUtils.randomAlphanumeric(3);
backUserAccountDao.disableBackUserAccountDO(accountId, accountNo);
......
......@@ -46,6 +46,7 @@ public class RealNameAuthServiceImpl implements RealNameAuthService {
@Override
public ResultBody add(RealNameAuthVO realNameAuthVO) {
log.info("RealNameAuthVO:{}", JSONObject.toJSONString(realNameAuthVO));
RealNameAuthDO realNameAuthDO0 = realNameAuthDao.getRealNameAuthByUId(realNameAuthVO.getUserAccountId());
if (realNameAuthDO0 != null && realNameAuthDO0.getCheckStatus().equals(1)) {
return ResultBody.error(ResultEnum.REAL_NAME_PASS_ERROR);
......
......@@ -6,15 +6,11 @@ import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.controller.userpoints.config.NumberOfUserPoints;
import com.mmc.iuav.user.controller.userpoints.config.UserPointsEnum;
import com.mmc.iuav.user.dao.CooperationDao;
import com.mmc.iuav.user.dao.RealNameAuthDao;
import com.mmc.iuav.user.dao.UserServiceDao;
import com.mmc.iuav.user.dao.*;
import com.mmc.iuav.user.dao.userpoints.UserPointsDao;
import com.mmc.iuav.user.dao.userpoints.UserPointsDetailsDao;
import com.mmc.iuav.user.entity.CooperationTagDO;
import com.mmc.iuav.user.entity.RealNameAuthDO;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.entity.UserRcdDO;
import com.mmc.iuav.user.dao.xzsz.XzDao;
import com.mmc.iuav.user.entity.*;
import com.mmc.iuav.user.entity.userpoints.UserPointsDO;
import com.mmc.iuav.user.entity.userpoints.UserPointsDetails;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
......@@ -78,6 +74,12 @@ public class UserAccountServiceImpl implements UserAccountService {
@Autowired
private RealNameAuthDao realNameAuthDao;
@Autowired
private XzDao xzDao;
@Autowired
private UserSubInfoDao userSubInfoDao;
@Override
public UserAccountVO getUserAccountInfoByUnionId(String unionId) {
......@@ -104,6 +106,7 @@ public class UserAccountServiceImpl implements UserAccountService {
RealNameAuthDTO realNameAuthDTO = nameAuthDTOResultBody.getResult();
if (realNameAuthDTO != null && realNameAuthDTO.getCheckStatus().equals(1)) {
userAccountVO.setRealNameAuthStatus(1);
userAccountVO.setUserName(realNameAuthDTO.getUserName());
}
CompanyAuthVO companyAuthVO = companyAuthService.getCompanyAuthByUId(userAccountId);
if (companyAuthVO != null) {
......@@ -116,6 +119,18 @@ public class UserAccountServiceImpl implements UserAccountService {
List<CooperationTagVO> cooperationTags = cooperationTagDOS.stream().map(CooperationTagDO::buildCooperationTagVO).collect(Collectors.toList());
userAccountVO.setCooperationTagVOS(cooperationTags);
}
XzAuthDO xzAuthDO = xzDao.getXzAuthByUserAccountId(userAccountId);
if (xzAuthDO != null) {
userAccountVO.setXzAuthStatus(xzAuthDO.getXzAuthStatus());
} else {
userAccountVO.setXzAuthStatus(0);
}
UserSubInfoDO userSubInfoDO = userSubInfoDao.getUserSubInfoByUnionId(userAccountDO.getUnionId());
if (userSubInfoDO != null && userSubInfoDO.getRegStatus().equals(1)) {
userAccountVO.setSubStatus(1);
} else {
userAccountVO.setSubStatus(0);
}
return userAccountVO;
}
......@@ -358,12 +373,26 @@ public class UserAccountServiceImpl implements UserAccountService {
}
}
@Autowired
private CompanyDao companyDao;
@Override
public ResultBody disableAppAccount(Integer userAccountId) {
userServiceDao.disableUserAccount(CodeUtil.removeUserAccount(), userAccountId);
UserAccountVO userAccountVO = new UserAccountVO();
userAccountVO.setId(userAccountId);
userAccountVO.setDeleted(1);
// 删除绑定企业信息,
// 该企业只有一人时可以直接删除,或者不是管理员时也可以直接删除,
// 是管理者时并且有多人则不能删除,提醒解绑成员后才能删除
CompanyInfoDO companyInfoDO = companyDao.getAppCompanyInfoUId(userAccountId);
if (companyInfoDO != null) {
int members = companyDao.countCompanyMembers(companyInfoDO.getId());
if (members > 1 && companyInfoDO.getLeader().equals(1)) {
return ResultBody.error("该用户是单位管理员,暂时不能删除");
}
companyDao.unbindCompanyMember(userAccountId, companyInfoDO.getId());
}
mqProducer.sentUserInfoChangedMsg(userAccountVO);
return ResultBody.success();
}
......
package com.mmc.iuav.user.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.mmc.iuav.http.HttpHelper;
import com.mmc.iuav.http.HttpsRequestUtil;
......@@ -26,6 +27,7 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
......@@ -134,9 +136,39 @@ public class WxServiceImpl implements WxService {
}
@Override
public String getSubStableAccessToken() {
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
String accessToken = stringRedisTemplate.opsForValue().get(WxConstant.SHARE_FLY_SUB_STABLE_ACCESS_TOKEN);
if (StringUtils.isBlank(accessToken)) {
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type", "client_credential");
params.put("appid", userSystemConstant.getWxSubAppId());
params.put("secret", userSystemConstant.getWxSubSecret());
String res = null;
try {
res = HttpsRequestUtil.httpsRequest("https://api.weixin.qq.com/cgi-bin/stable_token", "POST", null, JSONObject.toJSONString(params));
} catch (Exception e) {
e.printStackTrace();
}
JSONObject tokenResult = JSONObject.parseObject(res);
if (res.indexOf("access_token") == -1) {
log.info("获取公众号access_token有误:{}", tokenResult);
return null;
}
accessToken = tokenResult.getString("access_token");
long expiresIn = tokenResult.getLong("expires_in");
//保存进redis
stringRedisTemplate.opsForValue().set(WxConstant.SHARE_FLY_SUB_STABLE_ACCESS_TOKEN, accessToken, expiresIn, TimeUnit.SECONDS);
return accessToken;
}
return accessToken;
}
@Override
public String receiveSubAccountEvents(HttpServletRequest request) {
try {
Map<String, String> map = this.convertRequestToMap(request);
log.info("Received wx events(after convert):{}", JSONObject.toJSONString(map));
String event = map.get("Event");
if (WxConstant.subscribe.equals(event)) {
// 关注事件
......@@ -188,8 +220,8 @@ public class WxServiceImpl implements WxService {
try {
String InfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openid
+ "&lang=zh_CN";
//String jsonStr = HttpsOpenUtil.https(InfoUrl, "GET");// 错误:{"errcode":40013,"errmsg":"invalid appid"}
String jsonStr = HttpsRequestUtil.httpsRequest(InfoUrl, "GET", null, null);
String jsonStr = HttpsRequestUtil.httpsGet(InfoUrl, null);
log.info("updateWXUserInfo:{}", jsonStr);
JSONObject obj = JSONObject.parseObject(jsonStr);
// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
Integer subscribe = obj.getInteger("subscribe");
......@@ -215,10 +247,11 @@ public class WxServiceImpl implements WxService {
public ResultBody sendSubTemplateMsg(WxMsgVO ws) {
String accessToken = null;
try {
accessToken = this.getSubAccessToken();
accessToken = this.getSubStableAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
String param = ws.buildMsgJson();
String param = ws.buildTemplateMsg();
String result = HttpHelper.httpPost(url, param);
log.info("模板消息发送结果:{}", result);
} catch (Exception e) {
log.error("accessToken获取失败:{}", e.getMessage());
return ResultBody.error(ResultEnum.WX_ACCESS_TOKEN_ERROR.getResultCode(),
......@@ -307,4 +340,64 @@ public class WxServiceImpl implements WxService {
}
return null;
}
@Override
public ResultBody rid(String rid) throws Exception {
JSONObject param = new JSONObject();
param.put("rid", rid);
String url = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token=" + this.getSubAccessToken();
String res = HttpHelper.httpPost(url, param.toString());
return ResultBody.success(res);
}
@Override
public ResultBody moveSubUserToTest() {
String accessToken = this.getSubStableAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken;
String jsonStr = HttpsRequestUtil.httpsGet(url, null);
log.info("all users:{}", jsonStr);
JSONObject obj = JSONObject.parseObject(jsonStr);
List<String> lists = JSONArray.parseArray(obj.getJSONObject("data").get("openid").toString(), String.class);
int count = 0;
for (String openid : lists) {
Integer integer = userSubInfoDao.countUserSubInfo(openid);
if (integer == 0) {
count++;
UserSubInfoDO sub = new UserSubInfoDO();
sub.setOpenId(openid);
sub.setRegStatus(1);
sub.setDeleted(0);
sub.setCreateTime(new Date());
userSubInfoDao.insertUserSubInfo(sub);
}
}
log.info("User count: {}", count);
return ResultBody.success();
}
@Override
public ResultBody moveSubUserUnionIdToTest() {
String accessToken = this.getSubStableAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&next_openid=" + "oB6kk6obNektxM62mjj9PJHPtcME";
String jsonStr = HttpsRequestUtil.httpsGet(url, null);
log.info("all users:{}", jsonStr);
JSONObject obj = JSONObject.parseObject(jsonStr);
List<String> lists = JSONArray.parseArray(obj.getJSONObject("data").get("openid").toString(), String.class);
int count = 0;
for (String openid : lists) {
UserSubInfoDO userSubInfo = userSubInfoDao.getUserSubInfo(openid);
if (userSubInfo != null) {
String InfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openid
+ "&lang=zh_CN";
String jsonStr1 = HttpsRequestUtil.httpsGet(InfoUrl, null);
JSONObject obj1 = JSONObject.parseObject(jsonStr1);
userSubInfo.setUnionId(obj1.getString("unionid"));
userSubInfo.setRegStatus(1);
userSubInfoDao.updateUserSubInfo(userSubInfo);
}
}
log.info("User count: {}", count);
return ResultBody.success();
}
}
package com.mmc.iuav.user.service.wallet;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.vo.wallet.TopUpOrderVO;
import com.mmc.iuav.user.model.vo.wallet.WalletFlowVO;
/**
* @Author LW
......@@ -11,4 +14,12 @@ public interface PayWalletService {
ResultBody getPayWalletInfo(Integer userAccountId);
ResultBody initPayWallet(Integer userAccountId);
ResultBody feignWalletFlow(WalletFlowVO walletFlowVO);
ResultBody feignTopUpCash(TopUpOrderVO topUpOrderVO);
ResultBody customerBillingDetail(Integer userAccountId, WalletFlowQO walletFlowQO);
ResultBody billingDetails(Integer id, String detailType);
}
package com.mmc.iuav.user.service.wallet.impl;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.page.PageResult;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.dao.UserServiceDao;
import com.mmc.iuav.user.dao.wallet.PayWalletDao;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.entity.XzWithdrawalApplyDO;
import com.mmc.iuav.user.entity.wallet.PayLogDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import com.mmc.iuav.user.entity.wallet.UserBillingDetailVO;
import com.mmc.iuav.user.entity.wallet.WithdrawalLogDO;
import com.mmc.iuav.user.enums.PayMethodEnums;
import com.mmc.iuav.user.model.dto.wallet.PayWalletDTO;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.vo.WithdrawalInfoVO;
import com.mmc.iuav.user.model.vo.wallet.FlyerWalletFlowVO;
import com.mmc.iuav.user.model.vo.wallet.PublisherWalletFlowVO;
import com.mmc.iuav.user.model.vo.wallet.TopUpOrderVO;
import com.mmc.iuav.user.model.vo.wallet.WalletFlowVO;
import com.mmc.iuav.user.service.wallet.PayWalletService;
import com.mmc.iuav.user.util.TDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author LW
......@@ -15,9 +38,12 @@ import javax.annotation.Resource;
* 概要:
*/
@Service
@Slf4j
public class PayWalletServiceImpl implements PayWalletService {
@Resource
PayWalletDao payWalletDao;
@Resource
UserServiceDao userServiceDao;
@Override
public ResultBody getPayWalletInfo(Integer userAccountId) {
......@@ -38,4 +64,519 @@ public class PayWalletServiceImpl implements PayWalletService {
payWalletDao.insertPayWalletInfo(wallet);
return ResultBody.success();
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody feignWalletFlow(WalletFlowVO walletFlowVO) {
// 获取发布者的信息
PublisherWalletFlowVO publisherWalletFlowVO = walletFlowVO.getPublisherWalletFlowVO();
// 获取接单者的信息
FlyerWalletFlowVO flyerWalletFlowVO = walletFlowVO.getFlyerWalletFlowVO();
// 发布者的钱包信息
PayWalletDO publishWallet = new PayWalletDO();
// 接单者的钱包信息
PayWalletDO flyerWallet = new PayWalletDO();
// 获取用户钱包信息
if (publisherWalletFlowVO != null) {
publishWallet = payWalletDao.getPayWalletByUser(publisherWalletFlowVO.getUserAccountId());
}
if (flyerWalletFlowVO != null) {
flyerWallet = payWalletDao.getPayWalletByUser(flyerWalletFlowVO.getUserAccountId());
}
// 判断状态进行资金的扣减等于100时 发布订单
if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.PUBLISH_ORDER.getCode())) {
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getCashAmount())
.add(publisherWalletFlowVO.getTopYxjAmount()).add(publisherWalletFlowVO.getUrgentYxjAmount()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().subtract(publisherWalletFlowVO.getCashAmount())
.subtract(publisherWalletFlowVO.getTopYxjAmount()).subtract(publisherWalletFlowVO.getUrgentYxjAmount()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount())
.add(publisherWalletFlowVO.getTopSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getSalaryAmount())
.subtract(publisherWalletFlowVO.getTopSalaryAmount()).subtract(publisherWalletFlowVO.getUrgentSalaryAmount()));
int i = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (i > 0) {
PayLogDO payLogDO = buildPayLogDO(publisherWalletFlowVO, null);
payLogDO.setCashAmtPaid(publisherWalletFlowVO.getCashAmount().add(publisherWalletFlowVO.getTopYxjAmount()).add(publisherWalletFlowVO.getUrgentYxjAmount()));
payLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getSalaryAmount().add(publisherWalletFlowVO.getTopSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount()));
// 插入流水记录表
payWalletDao.insertPayLogDO(payLogDO);
return ResultBody.success();
} else {
log.error("发布订单时,用户钱包更新失败,用户id是:{},传入参数是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.CANCEL_ORDER_TAKING.getCode())) {
// 等于200时 发布方取消订单,无飞手接单
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getCashAmount()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().add(publisherWalletFlowVO.getTopYxjAmount())
.add(publisherWalletFlowVO.getUrgentYxjAmount()).subtract(publisherWalletFlowVO.getCashAmount()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().add(publisherWalletFlowVO.getTopSalaryAmount())
.add(publisherWalletFlowVO.getUrgentSalaryAmount()).subtract(publisherWalletFlowVO.getSalaryAmount()));
int i = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if ((i > 0) && (publisherWalletFlowVO.getCashAmount().compareTo(BigDecimal.ZERO) > 0 || publisherWalletFlowVO.getSalaryAmount().compareTo(BigDecimal.ZERO) > 0)) {
PayLogDO payLogDO = buildPayLogDO(publisherWalletFlowVO, null);
// 插入流水记录表
payWalletDao.insertPayLogDO(payLogDO);
return ResultBody.success();
} else {
log.error("发布方取消订单,无飞手接单时,用户id是:{},传入参数是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.RECEIVED_ORDER_CANCEL.getCode())) {
// 等于300时 发布方取消订单,有飞手接单
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getCashAmount()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().subtract(publisherWalletFlowVO.getCashAmount())
.add(publisherWalletFlowVO.getYxjCashPledge()).add(publisherWalletFlowVO.getTopYxjAmount()).add(publisherWalletFlowVO.getUrgentYxjAmount()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().add(publisherWalletFlowVO.getSalaryCashPledge())
.subtract(publisherWalletFlowVO.getSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount().add(publisherWalletFlowVO.getTopSalaryAmount())));
// 更新发布者钱包数据
int publishUpdateCount = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (publishUpdateCount <= 0) {
log.error("发布方取消订单,有飞手接单时,发单方用户钱包更新失败,更新参数是:{},发单方用户id是:{},传入参数是:{}", publishUpdatePayWallet, publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
if (publisherWalletFlowVO.getCashAmount().compareTo(BigDecimal.ZERO) > 0 || publisherWalletFlowVO.getSalaryAmount().compareTo(BigDecimal.ZERO) > 0) {
// 插入发布者流水记录表
sendBackPublishPayLog(publisherWalletFlowVO, 1);
}
// 飞手钱包更新信息
PayWalletDO flyerUpdatePayWallet = new PayWalletDO();
// 断言此处必定不为空
assert flyerWalletFlowVO != null;
flyerUpdatePayWallet.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
flyerUpdatePayWallet.setPid(flyerWallet.getPid());
flyerUpdatePayWallet.setCashAmt(flyerWallet.getCashAmt().add(flyerWalletFlowVO.getCashAmount()));
flyerUpdatePayWallet.setCashFreeze(flyerWallet.getCashFreeze().subtract(flyerWalletFlowVO.getCashAmount()));
flyerUpdatePayWallet.setSalaryAmt(flyerWallet.getSalaryAmt().add(flyerWalletFlowVO.getSalaryAmount()).subtract(publisherWalletFlowVO.getPercentagePenaltyOfOrder()));
flyerUpdatePayWallet.setSalaryFreeze(flyerWallet.getSalaryFreeze().subtract(flyerWalletFlowVO.getSalaryAmount()));
int flyerUpdateCount = payWalletDao.updatePayWallet(flyerUpdatePayWallet);
if (flyerUpdateCount > 0) {
// 记录订单保证金退回记录
if (flyerWalletFlowVO.getCashAmount().compareTo(BigDecimal.ZERO) > 0 || flyerWalletFlowVO.getSalaryAmount().compareTo(BigDecimal.ZERO) > 0) {
sendBackPledge(flyerWalletFlowVO);
}
// 获得违约金流水记录
paymentOfLiquidatedDamage(publisherWalletFlowVO, flyerWalletFlowVO, 0);
return ResultBody.success();
} else {
log.error("发布方取消订单,有飞手接单时,飞手用户钱包更新失败,飞手用户id是:{},接单方传入参数是:{},发单方违约金是:{}", flyerWalletFlowVO.getUserAccountId(), flyerWalletFlowVO, publisherWalletFlowVO.getPercentagePenaltyOfOrder());
}
} else if (flyerWalletFlowVO != null && flyerWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.FLYING_ORDER_TAKING.getCode())) {
// 状态为400时 表示飞手接单
// 飞手钱包更新信息
int flyerUpdateCount = buildFlyerWallet(flyerWalletFlowVO, flyerWallet);
if (flyerUpdateCount > 0) {
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
// 插入流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("飞手抢单时,飞手用户钱包更新失败,飞手用户id是:{},传入参数是:{}", flyerWalletFlowVO.getUserAccountId(), flyerWalletFlowVO);
}
} else if (flyerWalletFlowVO != null && flyerWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.CUSTOMER_SERVICE_CANCEL_ORDER.getCode())) {
// 状态为500时 客服判定飞手无责取消订单
// 飞手钱包更新信息
int flyerUpdateCount = buildFlyerWallet(flyerWalletFlowVO, flyerWallet);
if (flyerUpdateCount > 0) {
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
// 插入流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("客服判定飞手无责取消订单时,飞手用户钱包更新失败,飞手用户id是:{},传入参数是:{}", flyerWalletFlowVO.getUserAccountId(), flyerWalletFlowVO);
}
} else if (flyerWalletFlowVO != null && flyerWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.FLYER_CANCEL_ORDER.getCode())) {
// 状态为600时 飞手有责取消订单
// 飞手钱包更新信息
PayWalletDO flyerUpdatePayWallet = new PayWalletDO();
flyerUpdatePayWallet.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
flyerUpdatePayWallet.setPid(flyerWallet.getPid());
flyerUpdatePayWallet.setCashFreeze(flyerWallet.getCashFreeze().add(flyerWalletFlowVO.getYxjCashPledge()));
flyerUpdatePayWallet.setSalaryFreeze(flyerWallet.getSalaryFreeze().add(flyerWalletFlowVO.getSalaryCashPledge()));
int flyerUpdateCount = payWalletDao.updatePayWallet(flyerUpdatePayWallet);
if (flyerUpdateCount <= 0) {
log.error("飞手有责取消订单,飞手用户钱包更新失败,飞手用户id是:{},接单方传入参数是:{}", flyerWalletFlowVO.getUserAccountId(), flyerWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
// 发单者钱包更新信息
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
// 断言此处必定不为空
assert publisherWalletFlowVO != null;
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getCashAmount())
.add(publisherWalletFlowVO.getTopYxjAmount()).add(publisherWalletFlowVO.getTopYxjAmount()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount())
.subtract(flyerWalletFlowVO.getPercentagePenaltyOfOrder()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().subtract(publisherWalletFlowVO.getCashAmount())
.subtract(publisherWalletFlowVO.getUrgentYxjAmount()).subtract(publisherWalletFlowVO.getTopYxjAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getSalaryAmount())
.subtract(publisherWalletFlowVO.getUrgentSalaryAmount()).subtract(publisherWalletFlowVO.getTopSalaryAmount()));
int publishUpdateCount = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (publishUpdateCount > 0) {
// 记录飞手违约金流水
paymentOfLiquidatedDamage(publisherWalletFlowVO, flyerWalletFlowVO, 1);
if (publisherWalletFlowVO.getCashAmount().compareTo(BigDecimal.ZERO) > 0
|| publisherWalletFlowVO.getUrgentYxjAmount().compareTo(BigDecimal.ZERO) > 0
|| publisherWalletFlowVO.getTopYxjAmount().compareTo(BigDecimal.ZERO) > 0
|| publisherWalletFlowVO.getSalaryAmount().compareTo(BigDecimal.ZERO) > 0
|| publisherWalletFlowVO.getUrgentSalaryAmount().compareTo(BigDecimal.ZERO) > 0
|| publisherWalletFlowVO.getTopSalaryAmount().compareTo(BigDecimal.ZERO) > 0) {
// 记录退回订单金额
sendBackPublishPayLog(publisherWalletFlowVO, 0);
}
return ResultBody.success();
} else {
log.error("飞手有责取消订单,发布者用户钱包更新失败,发布者用户id是:{},发布方传入参数是:{},接单方方违约金是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO, flyerWalletFlowVO.getPercentagePenaltyOfOrder());
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.NORMAL_SETTLEMENT.getCode())) {
// 状态为700时 正常订单结算
// 解冻发布方订单的钱包金额
PayWalletDO publishPayWalletDO = new PayWalletDO();
publishPayWalletDO.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishPayWalletDO.setPid(publishWallet.getPid());
publishPayWalletDO.setCashFreeze(publishWallet.getCashFreeze().add(publisherWalletFlowVO.getCashAmount())
.add(publisherWalletFlowVO.getUrgentYxjAmount()).add(publisherWalletFlowVO.getTopYxjAmount()));
publishPayWalletDO.setSalaryFreeze(publishWallet.getSalaryFreeze().add(publisherWalletFlowVO.getSalaryAmount())
.add(publisherWalletFlowVO.getTopSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount()));
int publishUpdateCount = payWalletDao.updatePayWallet(publishPayWalletDO);
if (publishUpdateCount <= 0) {
log.error("正常结算时,发布者用户钱包更新失败,发布者id是:{},发布者传参是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
// 增加接单方钱包金额
assert flyerWalletFlowVO != null;
int flyerUpdateCount = addFlyerSalary(publisherWalletFlowVO, flyerWalletFlowVO, flyerWallet);
if (flyerUpdateCount > 0) {
// 记录订单保证金退回记录
sendBackPledge(flyerWalletFlowVO);
// 记录订单结算流水记录
PayLogDO flyerPayLogDO = buildFlyerLog(publisherWalletFlowVO, flyerWalletFlowVO.getUserAccountId());
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("正常结算时,接单方用户钱包更新失败,接单者id是:{},发布者传参是:{}", flyerWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.MODIFY_THE_ORDER.getCode())) {
// 状态为800时 发布方修改金额大于原来订单佣金
// 发布方还需补金额
if (releaseOrCancelOrderWallet(publisherWalletFlowVO, publishWallet)) {
PayLogDO payLogDO = buildPayLogDO(publisherWalletFlowVO, null);
// 插入流水记录表
payWalletDao.insertPayLogDO(payLogDO);
return ResultBody.success();
} else {
log.error("发布方修改金额大于原来订单佣金时,用户钱包更新失败,用户id是:{},传入参数是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.FLYING_HAND_NOT_CONFIRMED_GT.getCode())) {
// 状态为900时 飞手未确认修改金额大于原订单状态时订单结算
// 退回发布方后面补的金额
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getRefundSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getRefundSalaryAmount()));
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getRefundCashAmount()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().subtract(publisherWalletFlowVO.getRefundCashAmount()));
int publishUpdateCount = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (publishUpdateCount <= 0) {
log.error("飞手未确认修改金额大于原订单状态时,发布者用户钱包更新失败,发布者id是:{},发布者参数是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
// 记录发单方退回多余金额记录
refund(publisherWalletFlowVO);
// 增加接单方钱包金额
assert flyerWalletFlowVO != null;
int flyerUpdateCount = addFlyerSalary(publisherWalletFlowVO, flyerWalletFlowVO, flyerWallet);
if (flyerUpdateCount > 0) {
// 记录订单保证金退回记录
sendBackPledge(flyerWalletFlowVO);
// 记录订单结算流水记录
PayLogDO flyerPayLogDO = buildFlyerLog(publisherWalletFlowVO, flyerWalletFlowVO.getUserAccountId());
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("飞手未确认修改金额大于原订单状态时,接单方用户钱包更新失败,接单者id是:{},发布者传参是:{}", flyerWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
} else if (publisherWalletFlowVO != null && publisherWalletFlowVO.getModeOfPayment().equals(PayMethodEnums.FLYING_HAND_CONFIRM_LT.getCode())) {
// 状态为1000时 飞手确认修改金额小于原订单状态
// 退回发布方多余原订单金额,解冻钱包金额
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(publishWallet.getPid());
publishUpdatePayWallet.setCashAmt(publishWallet.getCashAmt().add(publisherWalletFlowVO.getRefundCashAmount()));
publishUpdatePayWallet.setCashFreeze(publishWallet.getCashFreeze().subtract(publisherWalletFlowVO.getRefundCashAmount())
.subtract(publisherWalletFlowVO.getCashAmount()).add(publisherWalletFlowVO.getUrgentYxjAmount()).add(publisherWalletFlowVO.getTopYxjAmount()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getRefundSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getRefundSalaryAmount())
.subtract(publisherWalletFlowVO.getSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount()).add(publisherWalletFlowVO.getTopYxjAmount()));
int publishUpdateCount = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (publishUpdateCount <= 0) {
log.error("飞手确认修改金额小于原订单状态,发布者用户钱包更新失败,发布者id是:{},发布者参数是:{}", publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
// 记录多余退款记录
refund(publisherWalletFlowVO);
// 增加接单方钱包金额
assert flyerWalletFlowVO != null;
int flyerUpdateCount = addFlyerSalary(publisherWalletFlowVO, flyerWalletFlowVO, flyerWallet);
if (flyerUpdateCount > 0) {
// 记录订单保证金退回记录
sendBackPledge(flyerWalletFlowVO);
// 记录订单结算流水记录
PayLogDO flyerPayLogDO = buildFlyerLog(publisherWalletFlowVO, flyerWalletFlowVO.getUserAccountId());
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("飞手确认修改金额小于原订单状态,接单方用户钱包更新失败,接单者id是:{},发布者传参是:{}", flyerWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
}
return ResultBody.error("钱包操作错误");
}
/**
* @param publisherWalletFlowVO
* @param flag 0 未违约取消 1 违约取消
*/
private void sendBackPublishPayLog(PublisherWalletFlowVO publisherWalletFlowVO, Integer flag) {
PayLogDO payLogDO = new PayLogDO();
String payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + publisherWalletFlowVO.getUserAccountId() + CodeUtil.getRandomNum(4);
if (flag == 0) {
payLogDO.setPayMethod(200);
payLogDO.setCashAmtPaid(publisherWalletFlowVO.getCashAmount().add(publisherWalletFlowVO.getTopYxjAmount()).add(publisherWalletFlowVO.getUrgentYxjAmount()));
payLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getSalaryAmount().add(publisherWalletFlowVO.getTopSalaryAmount()).add(publisherWalletFlowVO.getUrgentSalaryAmount()));
} else {
payLogDO.setPayMethod(300);
payLogDO.setCashAmtPaid(publisherWalletFlowVO.getCashAmount());
payLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getSalaryAmount());
}
payLogDO.setPayNo(payNo);
payLogDO.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
payLogDO.setOperateUser(publisherWalletFlowVO.getUserAccountId());
// 插入流水记录表
payWalletDao.insertPayLogDO(payLogDO);
}
/**
* @param publisherWalletFlowVO 发布者信息
* @param flyerWalletFlowVO 接单者信息
* @param flag 0:发布者违约 1:抢单者违约
*/
private void paymentOfLiquidatedDamage(PublisherWalletFlowVO publisherWalletFlowVO, FlyerWalletFlowVO flyerWalletFlowVO, Integer flag) {
PayLogDO flyerPayLogDO = new PayLogDO();
String payNo;
Integer userAccountId;
BigDecimal percentagePenaltyOfOrder;
if (flag == 0) {
// 生成支付流水号(规则"T" + 时间戳 + 用户id + 随机数4位)
payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + flyerWalletFlowVO.getUserAccountId() + CodeUtil.getRandomNum(4);
userAccountId = flyerWalletFlowVO.getUserAccountId();
percentagePenaltyOfOrder = publisherWalletFlowVO.getPercentagePenaltyOfOrder();
flyerPayLogDO.setOperateUser(userAccountId);
} else {
// 生成支付流水号(规则"T" + 时间戳 + 用户id + 随机数4位)
payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + publisherWalletFlowVO.getUserAccountId() + CodeUtil.getRandomNum(4);
userAccountId = publisherWalletFlowVO.getUserAccountId();
flyerPayLogDO.setOperateUser(userAccountId);
percentagePenaltyOfOrder = flyerWalletFlowVO.getPercentagePenaltyOfOrder();
}
flyerPayLogDO.setPayMethod(1300);
flyerPayLogDO.setPayNo(payNo);
flyerPayLogDO.setUserAccountId(userAccountId);
flyerPayLogDO.setCashAmtPaid(BigDecimal.ZERO);
flyerPayLogDO.setSalaryAmtPaid(percentagePenaltyOfOrder.abs());
// 插入流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
}
private PayLogDO buildFlyerLog(PublisherWalletFlowVO publisherWalletFlowVO, Integer userAccountId) {
PayLogDO payLogWalletDO = new PayLogDO();
// 生成支付流水号(规则"T" + 时间戳 + 用户id + 随机数4位)
String flyerPayNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + userAccountId + CodeUtil.getRandomNum(4);
payLogWalletDO.setPayMethod(publisherWalletFlowVO.getModeOfPayment());
payLogWalletDO.setPayNo(flyerPayNo);
payLogWalletDO.setUserAccountId(userAccountId);
payLogWalletDO.setSalaryAmtPaid(publisherWalletFlowVO.getFlyerSalaryAmount());
payLogWalletDO.setOperateUser(publisherWalletFlowVO.getUserAccountId());
return payLogWalletDO;
}
private void sendBackPledge(FlyerWalletFlowVO flyerWalletFlowVO) {
if (flyerWalletFlowVO.getCashAmount().compareTo(new BigDecimal(0)) > 0 || flyerWalletFlowVO.getSalaryAmount().compareTo(new BigDecimal(0)) > 0) {
PayLogDO flyerPledgeSendBack = buildPayLogDO(null, flyerWalletFlowVO);
flyerPledgeSendBack.setPayMethod(500);
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPledgeSendBack);
}
}
private int buildFlyerWallet(FlyerWalletFlowVO flyerWalletFlowVO, PayWalletDO flyerWallet) {
PayWalletDO flyerUpdatePayWallet = new PayWalletDO();
flyerUpdatePayWallet.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
flyerUpdatePayWallet.setPid(flyerWallet.getPid());
flyerUpdatePayWallet.setCashAmt(flyerWallet.getCashAmt().add(flyerWalletFlowVO.getCashAmount()));
flyerUpdatePayWallet.setCashFreeze(flyerWallet.getCashFreeze().subtract(flyerWalletFlowVO.getCashAmount()));
flyerUpdatePayWallet.setSalaryAmt(flyerWallet.getSalaryAmt().add(flyerWalletFlowVO.getSalaryAmount()));
flyerUpdatePayWallet.setSalaryFreeze(flyerWallet.getSalaryFreeze().subtract(flyerWalletFlowVO.getSalaryAmount()));
int flyerUpdateCount = payWalletDao.updatePayWallet(flyerUpdatePayWallet);
return flyerUpdateCount;
}
private void refund(PublisherWalletFlowVO publisherWalletFlowVO) {
if (publisherWalletFlowVO.getRefundCashAmount().compareTo(BigDecimal.ZERO) != 0 || publisherWalletFlowVO.getRefundSalaryAmount().compareTo(BigDecimal.ZERO) != 0) {
PayLogDO publishPayLogDO = buildPayLogDO(publisherWalletFlowVO, null);
publishPayLogDO.setCashAmtPaid(publisherWalletFlowVO.getRefundCashAmount());
publishPayLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getRefundSalaryAmount());
payWalletDao.insertPayLogDO(publishPayLogDO);
}
}
private int addFlyerSalary(PublisherWalletFlowVO publisherWalletFlowVO, FlyerWalletFlowVO flyerWalletFlowVO, PayWalletDO flyerWallet) {
assert flyerWalletFlowVO != null;
PayWalletDO flyerPayWalletDO = new PayWalletDO();
flyerPayWalletDO.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
flyerPayWalletDO.setPid(flyerWallet.getPid());
flyerPayWalletDO.setSalaryAmt(flyerWallet.getSalaryAmt().add(publisherWalletFlowVO.getFlyerSalaryAmount()).add(flyerWalletFlowVO.getSalaryAmount()));
flyerPayWalletDO.setSalaryFreeze(flyerWallet.getSalaryFreeze().subtract(flyerWalletFlowVO.getSalaryAmount()));
flyerPayWalletDO.setCashAmt(flyerWallet.getCashAmt().add(flyerWalletFlowVO.getCashAmount()));
flyerPayWalletDO.setCashFreeze(flyerWallet.getCashFreeze().subtract(flyerWalletFlowVO.getCashAmount()));
int flyerUpdateCount = payWalletDao.updatePayWallet(flyerPayWalletDO);
return flyerUpdateCount;
}
@Transactional(rollbackFor = Exception.class)
public boolean releaseOrCancelOrderWallet(PublisherWalletFlowVO publisherWalletFlowVO, PayWalletDO wallet) {
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
if (publisherWalletFlowVO.getCashAmount() == null) {
publisherWalletFlowVO.setCashAmount(BigDecimal.ZERO);
}
if (publisherWalletFlowVO.getSalaryAmount() == null) {
publisherWalletFlowVO.setSalaryAmount(BigDecimal.ZERO);
}
publishUpdatePayWallet.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(wallet.getPid());
publishUpdatePayWallet.setCashAmt(wallet.getCashAmt().add(publisherWalletFlowVO.getCashAmount()));
publishUpdatePayWallet.setCashFreeze(wallet.getCashFreeze().subtract(publisherWalletFlowVO.getCashAmount()));
publishUpdatePayWallet.setSalaryAmt(wallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(wallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getSalaryAmount()));
int i = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (i > 0) {
return true;
}
return false;
}
public PayLogDO buildPayLogDO(PublisherWalletFlowVO publisherWalletFlowVO, FlyerWalletFlowVO flyerWalletFlowVO) {
// 记录资金流水记录
PayLogDO payLogWalletDO = new PayLogDO();
// 获取用户钱包信息
if (publisherWalletFlowVO != null) {
// 生成支付流水号(规则"T" + 时间戳 + 用户id + 随机数4位)
String publishPayNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + publisherWalletFlowVO.getUserAccountId() + CodeUtil.getRandomNum(4);
payLogWalletDO.setPayMethod(publisherWalletFlowVO.getModeOfPayment());
payLogWalletDO.setPayNo(publishPayNo);
payLogWalletDO.setUserAccountId(publisherWalletFlowVO.getUserAccountId());
payLogWalletDO.setCashAmtPaid(publisherWalletFlowVO.getCashAmount());
payLogWalletDO.setSalaryAmtPaid(publisherWalletFlowVO.getSalaryAmount());
payLogWalletDO.setPayTime(publisherWalletFlowVO.getTimeOfPayment());
payLogWalletDO.setOperateUser(publisherWalletFlowVO.getOperateUserAccountId());
return payLogWalletDO;
}
if (flyerWalletFlowVO != null) {
if (flyerWalletFlowVO.getCashAmount() == null) {
flyerWalletFlowVO.setCashAmount(BigDecimal.ZERO);
}
if (flyerWalletFlowVO.getSalaryAmount() == null) {
flyerWalletFlowVO.setSalaryAmount(BigDecimal.ZERO);
}
// 生成支付流水号(规则"T" + 时间戳 + 用户id + 随机数4位)
String flyerPayNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + flyerWalletFlowVO.getUserAccountId() + CodeUtil.getRandomNum(4);
payLogWalletDO.setPayMethod(flyerWalletFlowVO.getModeOfPayment());
payLogWalletDO.setPayNo(flyerPayNo);
payLogWalletDO.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
payLogWalletDO.setCashAmtPaid(flyerWalletFlowVO.getCashAmount());
payLogWalletDO.setSalaryAmtPaid(flyerWalletFlowVO.getSalaryAmount());
payLogWalletDO.setPayTime(flyerWalletFlowVO.getTimeOfPayment());
payLogWalletDO.setOperateUser(flyerWalletFlowVO.getOperateUserAccountId());
return payLogWalletDO;
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody feignTopUpCash(TopUpOrderVO topUpOrderVO) {
// 获取用户openid查询到用户信息
UserAccountDO userAccountDO = userServiceDao.getUserAccountInfoByOpenId(topUpOrderVO.getOpenid());
// 根据金额转成元
BigDecimal topUpAmount = BigDecimal.valueOf(topUpOrderVO.getAmount()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
// 根据用户id获取钱包金额信息
PayWalletDO wallet = payWalletDao.getPayWalletByUser(userAccountDO.getId());
// 修改云享金信息
PayWalletDO payWalletDO = new PayWalletDO();
payWalletDO.setCashAmt(wallet.getCashAmt().add(topUpAmount));
payWalletDO.setPid(wallet.getPid());
payWalletDO.setUserAccountId(userAccountDO.getId());
int i = payWalletDao.updatePayWallet(payWalletDO);
if (i > 0) {
// 记录钱包流水
PayLogDO payLogDO = new PayLogDO();
payLogDO.setUserAccountId(userAccountDO.getId());
payLogDO.setPayNo(topUpOrderVO.getOrderNo());
payLogDO.setPayMethod(PayMethodEnums.USER_TOP_UP.getCode());
payLogDO.setCashAmtPaid(topUpAmount);
payLogDO.setOperateUser(userAccountDO.getId());
payWalletDao.insertPayLogDO(payLogDO);
return ResultBody.success();
} else {
return ResultBody.error("充值时钱包操作错误!");
}
}
@Override
public ResultBody customerBillingDetail(Integer userAccountId, WalletFlowQO param) {
param.setUserAccountId(userAccountId);
int count = payWalletDao.countPayLog(param);
if (count == 0) {
return ResultBody.success(PageResult.buildPage(param.getPageNo(), param.getPageSize(), count));
}
if (!StringUtils.isBlank(param.getYearMonth())) {
param.setEndTime(TDateUtil.getDateStr(
TDateUtil.getMonthLatestDay(TDateUtil.getDate(param.getYearMonth() + "-01", "yyyy-MM-dd")),
"yyyy-MM-dd") + " 23:59:59");
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<PayLogDO> payLogList = payWalletDao.getPayLog(param);
return ResultBody.success(PageResult.buildPage(pageNo, param.getPageSize(), count, payLogList.stream().map(PayLogDO::buildUserBillingDetailVO).collect(Collectors.toList())));
}
@Override
public ResultBody billingDetails(Integer id, String detailType) {
if (WithdrawalInfoVO.AMT.equals(detailType)) {
PayLogDO payLogDO = payWalletDao.getPayLogById(id);
return ResultBody.success(payLogDO.buildUserBillingDetailVO());
} else {
XzWithdrawalApplyDO apply = payWalletDao.getWithdrawalApplyByIdOrOuterTradeNo(id, null);
UserBillingDetailVO detail = apply.buildUserBillingDetailVO();
List<WithdrawalLogDO> rebates = payWalletDao.listPayWithdrawalLog(apply.getId());
detail.buildSchedules(rebates);
return ResultBody.success(detail);
}
}
}
package com.mmc.iuav.user.service.xzsz;
import com.mmc.iuav.page.PageResult;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.qo.wallet.WithdrawalApplyQO;
import com.mmc.iuav.user.model.vo.wallet.ApplyWithdrawalVO;
/**
* @author: zj
* @Date: 2023/8/23 16:09
*/
public interface WithdrawalService {
ResultBody apply(ApplyWithdrawalVO applyWithdrawalVO, Integer userAccountId);
ResultBody withdrawalList(Integer userAccountId, WalletFlowQO walletFlowQO);
PageResult listPageWithdrawalApply(WithdrawalApplyQO param);
ResultBody approveWithdrawalApply(Integer id, Integer applyStatus, Integer userAccountId, String remark);
}
package com.mmc.iuav.user.service.xzsz;
import cn.hutool.json.JSONObject;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.dto.xzsz.UsableCashPoolingDTO;
import com.mmc.iuav.user.model.vo.XzAuthVO;
import com.mmc.iuav.user.model.vo.XzWithdrawalVO;
import com.mmc.iuav.user.xzsz.SingleSubmitResp;
import com.mmc.iuav.user.xzsz.WithdrawalResp;
import java.util.List;
/**
* @author: zj
* @Date: 2023/8/21 9:52
*/
public interface XzService {
ResultBody getTaxFundList();
ResultBody getCashPooling();
List<UsableCashPoolingDTO> getUsableCashPooling();
String getContractScope(XzAuthVO xzAuthVO);
String hasKeyByUrl(LoginSuccessDTO loginSuccessDTO);
String xzAuthNotify(JSONObject notify);
JSONObject getSignedResult(XzAuthVO xzAuthVO);
String viewContract(String documentId);
ResultBody clearTestFace(String name, String idCard);
SingleSubmitResp singleSubmit(XzWithdrawalVO xzWithdrawalVO);
WithdrawalResp querySingleTrade(String outerTradeNo);
ResultBody querySingleReceipt(String frontLogNo);
String xzWithdrawNotify(JSONObject notify);
SingleSubmitResp singleSubmitLimit(XzWithdrawalVO xzWithdrawalVO);
}
package com.mmc.iuav.user.service.xzsz.impl;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.page.PageResult;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.dao.RealNameAuthDao;
import com.mmc.iuav.user.dao.wallet.PayWalletDao;
import com.mmc.iuav.user.dao.xzsz.WithdrawalDao;
import com.mmc.iuav.user.dao.xzsz.XzDao;
import com.mmc.iuav.user.entity.RealNameAuthDO;
import com.mmc.iuav.user.entity.XzAuthDO;
import com.mmc.iuav.user.entity.XzWithdrawalApplyDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import com.mmc.iuav.user.entity.wallet.WithdrawalLogDO;
import com.mmc.iuav.user.enums.WithdrawalApplyStatus;
import com.mmc.iuav.user.enums.WithdrawalMethod;
import com.mmc.iuav.user.enums.XzEnums;
import com.mmc.iuav.user.model.dto.wallet.WithdrawalApplyDTO;
import com.mmc.iuav.user.model.qo.wallet.WalletFlowQO;
import com.mmc.iuav.user.model.qo.wallet.WithdrawalApplyQO;
import com.mmc.iuav.user.model.vo.XzWithdrawalVO;
import com.mmc.iuav.user.model.vo.wallet.ApplyWithdrawalVO;
import com.mmc.iuav.user.service.xzsz.WithdrawalService;
import com.mmc.iuav.user.service.xzsz.XzService;
import com.mmc.iuav.user.util.TDateUtil;
import com.mmc.iuav.user.xzsz.SingleSubmitResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: zj
* @Date: 2023/8/23 16:09
*/
@Service
@Slf4j
public class WithdrawalServiceImpl implements WithdrawalService {
@Autowired
private WithdrawalDao withdrawalDao;
@Autowired
private XzDao xzDao;
@Resource
private RealNameAuthDao realNameAuthDao;
@Autowired
private PayWalletDao payWalletDao;
@Autowired
private XzService xzService;
@Override
@Transactional
public ResultBody apply(ApplyWithdrawalVO applyWithdrawalVO, Integer userAccountId) {
// 判断该用户是否实名认证
RealNameAuthDO realNameAuth = realNameAuthDao.getRealNameAuthByUId(userAccountId);
if (realNameAuth != null && !realNameAuth.getCheckStatus().equals(1)) {
return ResultBody.error("实名认证未通过!");
}
if (realNameAuth == null) {
return ResultBody.error(ResultEnum.PLEASE_ERFORM_REAL_NAME_AUTHENTICATION_FIRST);
}
// 确保已电签
XzAuthDO xzAuth = xzDao.getXzAuthByUserAccountId(userAccountId);
if (xzAuth != null && !xzAuth.getXzAuthStatus().equals(1)) {
return ResultBody.error("电签未通过!");
}
if (xzAuth == null) {
return ResultBody.error("请先完成电签操作!");
}
// 当前提现金额是否足够
PayWalletDO payWallet = payWalletDao.getPayWalletByUser(userAccountId);
BigDecimal salaryAmt = payWallet.getSalaryAmt();
if (salaryAmt.compareTo(applyWithdrawalVO.getPayAmount()) < 0) {
return ResultBody.error("当前金额大于可提现金额!");
}
applyWithdrawalVO.setUserAccountId(userAccountId);
// 生成提现交易编号
String outerTradeNo = "B" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + userAccountId + CodeUtil.getRandomNum(4);
// 记录提现申请记录
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO(applyWithdrawalVO);
xzWithdrawalApplyDO.setOuterTradeNo(outerTradeNo);
xzWithdrawalApplyDO.setEmpName(applyWithdrawalVO.getEmpName());
xzWithdrawalApplyDO.setEmpPhone(applyWithdrawalVO.getEmpPhone());
xzWithdrawalApplyDO.setLicenseId(realNameAuth.getIdNumber());
xzWithdrawalApplyDO.setLicenseType("ID_CARD");
xzWithdrawalApplyDO.setMonth(TDateUtil.getCurrentDateByType("yyyy-MM"));
xzWithdrawalApplyDO.setTradeStatus("apply");
withdrawalDao.insertWithdrawalApply(xzWithdrawalApplyDO);
// 生成提现流水编号
String payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + userAccountId + CodeUtil.getRandomNum(4);
// 记录流水记录
WithdrawalLogDO withdrawalLogDO = new WithdrawalLogDO();
withdrawalLogDO.setPayNo(payNo);
withdrawalLogDO.setPayTime(new Date());
withdrawalLogDO.setSalaryFreeze(applyWithdrawalVO.getPayAmount());
withdrawalLogDO.setSalaryPaid(BigDecimal.ZERO);
withdrawalLogDO.setXzWithdrawalApplyId(xzWithdrawalApplyDO.getId());
withdrawalLogDO.setUserAccountId(userAccountId);
withdrawalLogDO.setPayMethod(WithdrawalMethod.TXDJ.getCode());
payWalletDao.insertWithdrawalLog(withdrawalLogDO);
// 修改钱包信息,钱包冻结金额
PayWalletDO payWalletDO = new PayWalletDO();
payWalletDO.setPid(payWallet.getPid());
payWalletDO.setUserAccountId(userAccountId);
payWalletDO.setSalaryAmt(payWallet.getSalaryAmt().subtract(applyWithdrawalVO.getPayAmount()));
payWalletDO.setWdlFreeze(payWallet.getWdlFreeze().add(applyWithdrawalVO.getPayAmount()));
int updateCount = payWalletDao.updatePayWallet(payWalletDO);
if (updateCount != 1) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error("提现申请失败,请稍后重试!");
}
return ResultBody.success(xzWithdrawalApplyDO.getId());
}
@Override
public ResultBody withdrawalList(Integer userAccountId, WalletFlowQO param) {
if (!StringUtils.isBlank(param.getYearMonth())) {
param.setEndTime(TDateUtil.getDateStr(
TDateUtil.getMonthLatestDay(TDateUtil.getDate(param.getYearMonth() + "-01", "yyyy-MM-dd")),
"yyyy-MM-dd") + " 23:59:59");
}
param.setUserAccountId(userAccountId);
int count = payWalletDao.countPayWithdrawalLog(param);
if (count == 0) {
return ResultBody.success(PageResult.buildPage(param.getPageNo(), param.getPageSize(), count));
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<XzWithdrawalApplyDO> withdrawalLogList = payWalletDao.getWithdrawalListByUserAccountId(param);
return ResultBody.success(PageResult.buildPage(pageNo, param.getPageSize(), count, withdrawalLogList.stream()
.map(XzWithdrawalApplyDO::buildUserBillingDetailVO).collect(Collectors.toList())));
}
@Override
public PageResult listPageWithdrawalApply(WithdrawalApplyQO param) {
int count = payWalletDao.countWithdrawalApply(param);
if (count == 0) {
return PageResult.buildPage(param.getPageNo(), param.getPageSize(), count);
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<XzWithdrawalApplyDO> list = payWalletDao.listPageWithdrawalApply(param);
List<WithdrawalApplyDTO> pageList = list.stream().map(XzWithdrawalApplyDO::buildWithdrawalApplyDTO).collect(Collectors.toList());
return PageResult.buildPage(pageNo, param.getPageSize(), count, pageList);
}
@Override
@Transactional
public ResultBody approveWithdrawalApply(Integer id, Integer applyStatus, Integer approveUserAccountId, String remark) {
if (!WithdrawalApplyStatus.TXCG.getCode().toString().equals(applyStatus.toString())
&& !WithdrawalApplyStatus.TXSB.getCode().toString().equals(applyStatus.toString())) {
return ResultBody.error(ResultEnum.WITHDRAWAL_APPLY_STATUS_ERROR);
}
// 查询申请单信息
XzWithdrawalApplyDO applyInfo = payWalletDao.getWithdrawalApplyByIdOrOuterTradeNo(id, null);
if (applyInfo == null) {
return ResultBody.error(ResultEnum.WITHDRAWAL_INFO_NOT_FIND_ERROR);
}
if (!(WithdrawalApplyStatus.TXSQ.getCode().toString()).equals(applyInfo.getApplyStatus().toString())) {
return ResultBody.error(ResultEnum.WITHDRAWAL_REPEAT_CHECK_ERROR);
}
// 获取当前用户钱包信息
PayWalletDO wallet = payWalletDao.getPayWalletByUser(applyInfo.getUserAccountId());
// 修改申请单的操作人信息
XzWithdrawalApplyDO apply = new XzWithdrawalApplyDO();
apply.setId(id);
apply.setApplyStatus(applyStatus);
apply.setRemark(remark);
apply.setApproveUser(approveUserAccountId);
apply.setApproveTime(new Date());
payWalletDao.updateWithdrawalApply(apply);
if (WithdrawalApplyStatus.TXCG.getCode().toString().equals(applyStatus.toString())) {
// 如果判断审批状态是成功,那么就调用小猪结算提现接口
XzWithdrawalVO xzWithdrawalVO = new XzWithdrawalVO();
xzWithdrawalVO.setUserAccountId(applyInfo.getUserAccountId());
xzWithdrawalVO.setMonth(applyInfo.getMonth());
xzWithdrawalVO.setOuterTradeNo(applyInfo.getOuterTradeNo());
xzWithdrawalVO.setEmpName(applyInfo.getEmpName());
xzWithdrawalVO.setEmpPhone(applyInfo.getEmpPhone());
xzWithdrawalVO.setLicenseType(applyInfo.getLicenseType());
xzWithdrawalVO.setLicenseId(applyInfo.getLicenseId());
xzWithdrawalVO.setSettleType(applyInfo.getSettleType());
xzWithdrawalVO.setPayAccount(applyInfo.getPayAccount());
xzWithdrawalVO.setBankName(applyInfo.getBankName());
xzWithdrawalVO.setPositionName(applyInfo.getPositionName());
xzWithdrawalVO.setPayAmount(applyInfo.getPayAmount());
SingleSubmitResp singleSubmitResp = xzService.singleSubmit(xzWithdrawalVO);
if (XzEnums.F.getCode().equals(singleSubmitResp.getIsSuccess())) {
// 更新提现申请记录
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO();
xzWithdrawalApplyDO.setOuterTradeNo(applyInfo.getOuterTradeNo());
xzWithdrawalApplyDO.setTradeResult(XzEnums.failure.getName());
xzWithdrawalApplyDO.setTradeStatus(XzEnums.failure.getCode());
xzWithdrawalApplyDO.setErrorCode(singleSubmitResp.getErrorCode());
xzWithdrawalApplyDO.setErrorMessage(singleSubmitResp.getErrorMessage());
payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
// 回滚用户钱包金额
rollbackPayWallet(applyInfo, wallet);
}
} else {
// 审批未通过 退回金额 解除冻结
// 更新提现申请记录
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO();
xzWithdrawalApplyDO.setOuterTradeNo(applyInfo.getOuterTradeNo());
xzWithdrawalApplyDO.setTradeResult("审批未通过");
xzWithdrawalApplyDO.setTradeStatus("approve");
payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
int updateCount = rollbackPayWallet(applyInfo, wallet);
if (updateCount != 1) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error("操作失败,请稍后重试!");
}
}
return ResultBody.success();
}
@Transactional(rollbackFor = Exception.class)
public int rollbackPayWallet(XzWithdrawalApplyDO applyInfo, PayWalletDO wallet) {
// 生成提现流水编号
String payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + applyInfo.getUserAccountId() + CodeUtil.getRandomNum(4);
// 记录流水记录
WithdrawalLogDO withdrawalLogDO = new WithdrawalLogDO();
withdrawalLogDO.setPayNo(payNo);
withdrawalLogDO.setPayTime(new Date());
withdrawalLogDO.setSalaryPaid(BigDecimal.valueOf(applyInfo.getPayAmount()));
withdrawalLogDO.setXzWithdrawalApplyId(applyInfo.getId());
withdrawalLogDO.setUserAccountId(applyInfo.getUserAccountId());
withdrawalLogDO.setPayMethod(WithdrawalMethod.TXSB.getCode());
withdrawalLogDO.setSalaryFreeze(new BigDecimal(0));
payWalletDao.insertWithdrawalLog(withdrawalLogDO);
// 修改钱包信息,钱包冻结金额
PayWalletDO payWalletDO = new PayWalletDO();
payWalletDO.setPid(wallet.getPid());
payWalletDO.setUserAccountId(applyInfo.getUserAccountId());
payWalletDO.setSalaryAmt(wallet.getSalaryAmt().add(BigDecimal.valueOf(applyInfo.getPayAmount())));
payWalletDO.setWdlFreeze(wallet.getWdlFreeze().subtract(BigDecimal.valueOf(applyInfo.getPayAmount())));
return payWalletDao.updatePayWallet(payWalletDO);
}
}
package com.mmc.iuav.user.service.xzsz.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.net.URLDecoder;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.http.HttpsRequestUtil;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.constant.UserSystemConstant;
import com.mmc.iuav.user.dao.RealNameAuthDao;
import com.mmc.iuav.user.dao.wallet.PayWalletDao;
import com.mmc.iuav.user.dao.xzsz.XzDao;
import com.mmc.iuav.user.entity.RealNameAuthDO;
import com.mmc.iuav.user.entity.XzAuthDO;
import com.mmc.iuav.user.entity.XzWithdrawalApplyDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import com.mmc.iuav.user.entity.wallet.WithdrawalLogDO;
import com.mmc.iuav.user.enums.WithdrawalMethod;
import com.mmc.iuav.user.enums.XzEnums;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.dto.xzsz.UsableCashPoolingDTO;
import com.mmc.iuav.user.model.vo.XzAuthVO;
import com.mmc.iuav.user.model.vo.XzWithdrawalVO;
import com.mmc.iuav.user.service.xzsz.XzService;
import com.mmc.iuav.user.util.TDateUtil;
import com.mmc.iuav.user.xzsz.SingleSubmitResp;
import com.mmc.iuav.user.xzsz.WithdrawalResp;
import com.piggy.settlement.sdk.client.sign.PiggySignApiClient;
import com.piggy.settlement.sdk.client.v2.bankreceipt.PiggyBankReceiptClient;
import com.piggy.settlement.sdk.client.v2.basics.PiggyOpenBasicsClient;
import com.piggy.settlement.sdk.client.v2.singlewithdraw.PiggySingleWithdrawalApiV2Client;
import com.piggy.settlement.sdk.util.v2.PiggyOpenBasicsAesUtil;
import com.piggy.settlement.sdk.vo.sign.PiggySignResultVo;
import com.piggy.settlement.sdk.vo.sign.PiggySignVo;
import com.piggy.settlement.sdk.vo.v2.bankreceipt.PiggyBankReceiptVo;
import com.piggy.settlement.sdk.vo.v2.basics.PiggyBasicsVo;
import com.piggy.settlement.sdk.vo.v2.singlewithdraw.PiggySingleWithdrawV2Vo;
import com.piggy.settlement.sdk.vo.v2.singlewithdraw.PiggySingleWithdrawalQueryV2Vo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author: zj
* @Date: 2023/8/21 9:52
*/
@Service
@Slf4j
public class XzServiceImpl implements XzService {
@Autowired
private UserSystemConstant userSystemConstant;
@Autowired
private XzDao xzDao;
@Resource
private PayWalletDao payWalletDao;
@Autowired
private RealNameAuthDao realNameAuthDao;
@Override
public ResultBody getTaxFundList() {
PiggyOpenBasicsClient piggyOpenBasicsClient = PiggyOpenBasicsClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggyOpenBasicsClient.getTaxFundList(PiggyBasicsVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.build());
return ResultBody.success(jsonObject.get("data"));
}
@Override
public ResultBody getCashPooling() {
PiggyOpenBasicsClient piggyOpenBasicsClient = PiggyOpenBasicsClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggyOpenBasicsClient.getCashPooling(PiggyBasicsVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.build());
System.out.println(jsonObject.toString());
return ResultBody.success(jsonObject.get("data"));
}
@Override
public List<UsableCashPoolingDTO> getUsableCashPooling() {
PiggyOpenBasicsClient piggyOpenBasicsClient = PiggyOpenBasicsClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggyOpenBasicsClient.getTaxFundCashPooling(PiggyBasicsVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.taxFundID(userSystemConstant.getTaxFundId())
.build());
System.out.println(jsonObject.toString());
List<UsableCashPoolingDTO> data = JSONArray.parseArray(jsonObject.get("data").toString(), UsableCashPoolingDTO.class);
return data;
}
@Override
public String getContractScope(XzAuthVO xzAuthVO) {
PiggySignApiClient piggySignApiClient = PiggySignApiClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggySignApiClient.getSignStatus(PiggySignResultVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.idCardNo(xzAuthVO.getIdCardNo())
.userName(xzAuthVO.getUsername())
.position(userSystemConstant.getXzPosition())
.build());
System.out.println(jsonObject.toString());
return jsonObject.toString();
}
@Override
public String hasKeyByUrl(LoginSuccessDTO loginSuccessDTO) {
// 获取实名认证信息
RealNameAuthDO realNameAuthDO = realNameAuthDao.getRealNameAuthByUId(loginSuccessDTO.getUserAccountId());
if (realNameAuthDO == null) {
return "先完成实名认证再签署!";
}
XzAuthVO xzAuthVO = new XzAuthVO(realNameAuthDO.getUserName(), realNameAuthDO.getIdNumber(),
loginSuccessDTO.getPhoneNum(), null, realNameAuthDO.getFrontIdImg(), realNameAuthDO.getBackIdImg());
// 查询是否已电子签约
String contractScope = this.getContractScope(xzAuthVO);
com.alibaba.fastjson2.JSONObject jsonObject1 = com.alibaba.fastjson2.JSONObject.parseObject(contractScope);
if (jsonObject1.get("data") != null) {
// 添加认证签约结果
JSONObject signedResult = this.getSignedResult(xzAuthVO);
if (signedResult.get("msg").equals("success")) {
// log.info("Signed result: {}", signedResult);
List<JSONObject> jsonObjects = JSONArray.parseArray(signedResult.get("data").toString(), JSONObject.class);
// log.info("jsonObjects : {}", com.alibaba.fastjson2.JSONObject.toJSONString(jsonObjects));
XzAuthDO xzAuthDO = xzDao.getXzAuthByUserAccountId(loginSuccessDTO.getUserAccountId());
if (xzAuthDO == null && !CollectionUtils.isEmpty(jsonObjects)) {
xzAuthDO = buildXzAuthDO(loginSuccessDTO, jsonObjects.get(0));
xzDao.addAuth(xzAuthDO);
}
}
return "success";
} else {
Map<String, Integer> userInfo = new HashMap<String, Integer>();
userInfo.put("userAccountId", loginSuccessDTO.getUserAccountId());
PiggySignApiClient piggySignApiClient = PiggySignApiClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggySignApiClient.getSignUrl(PiggySignVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.customParams(com.alibaba.fastjson2.JSONObject.toJSONString(userInfo))
.idCardNo(realNameAuthDO.getIdNumber())
.infoSource("1")
.jumpPage("https://test.iuav.shop/network/#/pages/electronic-contracting/index")
.mobile(loginSuccessDTO.getPhoneNum())
.notifyUrl(userSystemConstant.getAuthNotify())
.position(userSystemConstant.getXzPosition())
.userName(realNameAuthDO.getUserName())
.idCardImageFront(realNameAuthDO.getFrontIdImg())
.idCardImageBack(realNameAuthDO.getBackIdImg())
.build());
// TODO 发送模板消息
return jsonObject.get("data").toString();
}
}
private XzAuthDO buildXzAuthDO(LoginSuccessDTO loginSuccessDTO, JSONObject jsonObject) {
XzAuthDO xzAuthDO = new XzAuthDO();
xzAuthDO.setUserAccountId(loginSuccessDTO.getUserAccountId());
xzAuthDO.setName(jsonObject.get("name").toString());
xzAuthDO.setIdCardNo(jsonObject.get("idCardNo").toString());
xzAuthDO.setMobile(jsonObject.get("mobile").toString());
xzAuthDO.setBankAccount(jsonObject.get("bankAccount").toString());
xzAuthDO.setSubsidiary_name(jsonObject.get("subsidiary_name").toString());
xzAuthDO.setDocument_id(jsonObject.get("document_id").toString());
xzAuthDO.setXzAuthStatus(1);
return xzAuthDO;
}
@Transactional
@Override
public String xzAuthNotify(JSONObject notify) {
log.info("xzAuthNotify获取到的推送结果:{}", notify.toString());
// 认证成功,修改认证状态
if (notify.get("code").toString().equals("0")) {
XzAuthDO authDO = notify.get("data", XzAuthDO.class);
Integer userAccountId = (Integer) com.alibaba.fastjson2.JSONObject.parseObject(authDO.getCustomParams()).get("userAccountId");
if (userAccountId != null) {
XzAuthDO xzAuthDO = xzDao.getXzAuthByUserAccountId(userAccountId);
if (xzAuthDO == null) {
authDO.setUserAccountId(userAccountId);
authDO.setXzAuthStatus(1);
xzDao.addAuth(authDO);
return "success";
}
}
}
return null;
}
@Override
public JSONObject getSignedResult(XzAuthVO xzAuthVO) {
PiggySignApiClient piggySignApiClient = PiggySignApiClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggySignApiClient.getSignResult(PiggySignResultVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.idCardNo(xzAuthVO.getIdCardNo())
.userName(xzAuthVO.getUsername())
.build());
System.out.println(jsonObject.toString());
return jsonObject;
}
@Override
public String viewContract(String documentId) {
PiggySignApiClient piggySignApiClient = PiggySignApiClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggySignApiClient.viewContract(documentId);
System.out.println(jsonObject.toString());
return jsonObject.toString();
}
@Override
public ResultBody clearTestFace(String name, String idCard) {
String s = HttpsRequestUtil.httpsGet("https://uat.xzsz.ltd/contract/sign/clearTestPerson" + "name=" + name + "&idCard=" + idCard, null);
return ResultBody.success(s);
}
@Override
public SingleSubmitResp singleSubmit(XzWithdrawalVO xzWithdrawalVO) {
log.info("singleSubmit param: {}", com.alibaba.fastjson2.JSONObject.toJSONString(xzWithdrawalVO));
PiggySingleWithdrawalApiV2Client v2Client = PiggySingleWithdrawalApiV2Client.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = v2Client.singleSubmit(PiggySingleWithdrawV2Vo.builder()
.appKey(userSystemConstant.getXzAppKey())
.bizAESContent(PiggyOpenBasicsAesUtil.produceAesData(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzAes(), PiggySingleWithdrawV2Vo.SingleWithdrawV2Vo.builder()
.notifyUrl(userSystemConstant.getWithdrawNotify())
.taxFundId(userSystemConstant.getTaxFundId())
.month(xzWithdrawalVO.getMonth())
.outerTradeNo(xzWithdrawalVO.getOuterTradeNo())
.empNum(xzWithdrawalVO.getEmpNum())
.empName(xzWithdrawalVO.getEmpName())
.empPhone(xzWithdrawalVO.getEmpPhone())
.licenseType(xzWithdrawalVO.getLicenseType())
.licenseId(xzWithdrawalVO.getLicenseId())
.settleType(xzWithdrawalVO.getSettleType())
.payAccount(xzWithdrawalVO.getPayAccount())
.positionName(userSystemConstant.getXzPosition())
.payAmount(xzWithdrawalVO.getPayAmount())
.bankRemo(xzWithdrawalVO.getBankRemo())
.build()))
.build());
log.info("singleSubmit res: {}", com.alibaba.fastjson2.JSONObject.toJSONString(jsonObject));
SingleSubmitResp singleSubmitResp = com.alibaba.fastjson2.JSONObject.parseObject(jsonObject.toString(), SingleSubmitResp.class);
return singleSubmitResp;
}
@Override
public SingleSubmitResp singleSubmitLimit(XzWithdrawalVO xzWithdrawalVO) {
PiggySingleWithdrawalApiV2Client v2Client = PiggySingleWithdrawalApiV2Client.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = v2Client.singleSubmitLimit(PiggySingleWithdrawV2Vo.builder()
.appKey(userSystemConstant.getXzAppKey())
.bizAESContent(PiggyOpenBasicsAesUtil.produceAesData(userSystemConstant.getXzAppKey(), userSystemConstant.getXzAes(), PiggySingleWithdrawV2Vo.SingleWithdrawV2Vo.builder()
.notifyUrl(xzWithdrawalVO.getNotifyUrl())
.taxFundId(xzWithdrawalVO.getTaxFundId())
.month(xzWithdrawalVO.getMonth())
.outerTradeNo(xzWithdrawalVO.getOuterTradeNo())
.empNum(xzWithdrawalVO.getEmpNum())
.empName(xzWithdrawalVO.getEmpName())
.empPhone(xzWithdrawalVO.getEmpPhone())
.licenseType(xzWithdrawalVO.getLicenseType())
.licenseId(xzWithdrawalVO.getLicenseId())
.settleType(xzWithdrawalVO.getSettleType())
.payAccount(xzWithdrawalVO.getPayAccount())
.positionName(xzWithdrawalVO.getPositionName())
.payAmount(xzWithdrawalVO.getPayAmount())
.bankRemo(xzWithdrawalVO.getBankRemo())
.build()))
.build());
System.out.println(jsonObject.toString());
SingleSubmitResp singleSubmitResp = com.alibaba.fastjson2.JSONObject.parseObject(jsonObject.toString(), SingleSubmitResp.class);
return singleSubmitResp;
}
@Override
public WithdrawalResp querySingleTrade(String outerTradeNo) {
PiggySingleWithdrawalApiV2Client v2Client = PiggySingleWithdrawalApiV2Client.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = v2Client.querySingleTrade(PiggySingleWithdrawalQueryV2Vo.builder()
.appKey(userSystemConstant.getXzAppKey())
.outerTradeNo(outerTradeNo)
.build());
WithdrawalResp withdrawalResp = com.alibaba.fastjson2.JSONObject.parseObject(jsonObject.toString(), WithdrawalResp.class);
return withdrawalResp;
}
@Override
public ResultBody querySingleReceipt(String frontLogNo) {
PiggyBankReceiptClient piggyBankReceiptClient = PiggyBankReceiptClient.getInstanse(userSystemConstant.getXzAppSecret(), userSystemConstant.getXzDomain());
JSONObject jsonObject = piggyBankReceiptClient.getSingleReceipt(PiggyBankReceiptVo.builder()
.appKey(userSystemConstant.getXzAppKey())
.frontLogNo(frontLogNo)
.build());
System.out.println(jsonObject.toString());
if (jsonObject.get("isSuccess").toString().equals("T")) {
return ResultBody.success(jsonObject.get("data"));
} else {
return ResultBody.error(jsonObject.get("errorMessage").toString());
}
}
@Override
@Transactional
public String xzWithdrawNotify(JSONObject notify) {
log.info("xzWithdrawNotify获取到的推送结果:{}", notify.toString());
if (XzEnums.T.getCode().equals(notify.get(XzEnums.is_success.getCode()).toString())) {
String s = decrypt(com.alibaba.fastjson2.JSONObject.parseObject(notify.get("data").toString()).get("bizAESContent").toString());
WithdrawalResp.Data data = com.alibaba.fastjson2.JSONObject.parseObject(s, WithdrawalResp.Data.class);
log.info("提现回调解密数据内容:{}", com.alibaba.fastjson2.JSONObject.toJSONString(data));
// 获取用户提现申请信息
XzWithdrawalApplyDO withdrawCashApplyDetails = payWalletDao.getWithdrawalApplyByIdOrOuterTradeNo(null, data.getOuterTradeNo());
// 获取用户钱包信息
PayWalletDO wallet = payWalletDao.getPayWalletByUser(withdrawCashApplyDetails.getUserAccountId());
if (XzEnums.submit_result.getCode().equals(data.getNotifyType())) {
// 对上报的数据进行业务校验,例如:是否超限、是否有余额、是否有电签、参数是否准确等等前置校验。如果校验成功,订单进入待发队列等待发放
log.info("deal submitResult");
// 判断返回的状态时否是成功
if (XzEnums.success.getCode().equals(data.getTradeStatus())) {
// 更新提现申请记录
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO();
xzWithdrawalApplyDO.setOuterTradeNo(data.getOuterTradeNo());
xzWithdrawalApplyDO.setSubmitStatus(data.getTradeStatus());
xzWithdrawalApplyDO.setTradeResult(data.getTradeResult());
xzWithdrawalApplyDO.setTradeStatus("await");
xzWithdrawalApplyDO.setTaxFundId(userSystemConstant.getTaxFundId());
payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
} else {
// 更新提现申请记录
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO();
xzWithdrawalApplyDO.setOuterTradeNo(data.getOuterTradeNo());
xzWithdrawalApplyDO.setSubmitStatus(data.getTradeStatus());
xzWithdrawalApplyDO.setTradeResult(data.getTradeResult());
xzWithdrawalApplyDO.setTradeStatus(data.getTradeStatus());
payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
// 提现失败回滚用户金额
callbackUserPayWallet(data, withdrawCashApplyDetails, wallet, 0);
}
} else if (XzEnums.trade_result.getCode().equals(data.getNotifyType())) {
// 根据回调信息返回数据更新提现申请
if (withdrawCashApplyDetails.getTradeStatus() != null && withdrawCashApplyDetails.getTradeStatus().equals(XzEnums.success.getCode())) {
return "success";
}
XzWithdrawalApplyDO xzWithdrawalApplyDO = new XzWithdrawalApplyDO();
int updateCount;
// 判断返回的是成功还是失败
if (XzEnums.success.getCode().equals(data.getTradeStatus())) {
// 修改提现申请状态
xzWithdrawalApplyDO.setTradeStatus(XzEnums.success.getCode());
xzWithdrawalApplyDO.setTradeTime(data.getTradeTime());
xzWithdrawalApplyDO.setOuterTradeNo(data.getOuterTradeNo());
xzWithdrawalApplyDO.setFrontLogNo(data.getFrontLogNo());
xzWithdrawalApplyDO.setTradeResult(data.getTradeResult());
updateCount = payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
if (updateCount != 1) {
log.error("回调返回提现成功时,修改提现申请信息失败,信息是:{}", JSON.toJSONString(xzWithdrawalApplyDO));
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "error";
}
// 解冻冻结金,记录流水
callbackUserPayWallet(data, withdrawCashApplyDetails, wallet, 1);
return "success";
} else if (XzEnums.handle.getCode().equals(data.getTradeStatus())) {
// 修改提现申请状态
xzWithdrawalApplyDO.setTradeStatus(XzEnums.handle.getCode());
xzWithdrawalApplyDO.setTradeTime(data.getTradeTime());
xzWithdrawalApplyDO.setOuterTradeNo(data.getOuterTradeNo());
xzWithdrawalApplyDO.setFrontLogNo(data.getFrontLogNo());
xzWithdrawalApplyDO.setTradeResult(data.getTradeResult());
updateCount = payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
if (updateCount != 1) {
log.error("回调返回提现交易中时,修改提现申请信息失败,信息是:{}", JSON.toJSONString(xzWithdrawalApplyDO));
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "error";
}
} else {
// 修改提现申请状态
xzWithdrawalApplyDO.setTradeStatus(XzEnums.failure.getCode());
xzWithdrawalApplyDO.setErrorMessage(data.getTradeFailCode());
xzWithdrawalApplyDO.setTradeTime(data.getTradeTime());
xzWithdrawalApplyDO.setOuterTradeNo(data.getOuterTradeNo());
xzWithdrawalApplyDO.setTradeResult(data.getTradeResult());
updateCount = payWalletDao.updateWithdrawalApply(xzWithdrawalApplyDO);
if (updateCount != 1) {
log.error("回调返回提现交易中时,修改提现申请信息失败,信息是:{}", JSON.toJSONString(xzWithdrawalApplyDO));
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "error";
}
// 提现失败回滚用户金额
callbackUserPayWallet(data, withdrawCashApplyDetails, wallet, 0);
}
}
} else {
log.info("xzWithdrawNotify fail:{}", notify);
}
return "success";
}
/**
* @param data 回调返回的数据
* @param withdrawCashApplyDetails 提现申请信息
* @param wallet 用户钱包信息
* @param flag 0:失败 1:成功
*/
@Transactional(rollbackFor = Exception.class)
public void callbackUserPayWallet(WithdrawalResp.Data data, XzWithdrawalApplyDO withdrawCashApplyDetails, PayWalletDO wallet, Integer flag) {
String payNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + withdrawCashApplyDetails.getUserAccountId() + CodeUtil.getRandomNum(4);
// 记录流水记录
WithdrawalLogDO withdrawalLogDO = new WithdrawalLogDO();
withdrawalLogDO.setPayNo(payNo);
withdrawalLogDO.setXzWithdrawalApplyId(withdrawCashApplyDetails.getId());
withdrawalLogDO.setPayTime(new Date());
withdrawalLogDO.setUserAccountId(withdrawCashApplyDetails.getUserAccountId());
withdrawalLogDO.setSalaryPaid(data.getPayAmount());
if (flag == 0) {
withdrawalLogDO.setPayMethod(WithdrawalMethod.TXSB.getCode());
} else {
withdrawalLogDO.setPayMethod(WithdrawalMethod.TXCG.getCode());
}
withdrawalLogDO.setSalaryFreeze(BigDecimal.ZERO);
payWalletDao.insertWithdrawalLog(withdrawalLogDO);
// 修改钱包信息,钱包冻结金额
PayWalletDO payWalletDO = new PayWalletDO();
payWalletDO.setPid(wallet.getPid());
payWalletDO.setUserAccountId(withdrawCashApplyDetails.getUserAccountId());
if (flag == 0) {
payWalletDO.setSalaryAmt(wallet.getSalaryAmt().add(data.getPayAmount()));
} else {
payWalletDO.setSalaryWdl(wallet.getSalaryWdl().add(data.getPayAmount()));
}
payWalletDO.setWdlFreeze(wallet.getWdlFreeze().subtract(data.getPayAmount()));
int updatePayWalletCount = payWalletDao.updatePayWallet(payWalletDO);
if (updatePayWalletCount != 1) {
log.error("回调返回提现时,修改钱包信息失败,信息是:{}", JSON.toJSONString(payWalletDO));
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
public String decrypt(String aesData) {
try {
byte[] raw = userSystemConstant.getXzAppSecret().getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(userSystemConstant.getXzAes().getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
Charset charset = Charset.forName("UTF-8");
String tempStr = URLDecoder.decode(aesData, charset);
byte[] encrypted1 = Base64.decode(tempStr);
byte[] original = cipher.doFinal(encrypted1);
String jsonParam = new String(original, "UTF-8");
return jsonParam;
} catch (Exception e) {
System.out.println("AES解密异常" + e);
}
return "";
}
}
package com.mmc.iuav.user.util;
/**
* 正则表达式匹配
*
* @author tyg
* @date 2018年9月21日下午4:32:27
*/
public class PatternUtil {
/**
* 手机号码匹配
*/
public static final String PHONE_REG = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$";
/**
* 座机号码匹配
*/
public static final String MOBILE_REG = "^\\d{3}-\\d{8}|\\d{4}-\\d{7}$";
/**
* 汉字匹配
*/
public static final String CHIINESE_REG = "^[\\u4e00-\\u9fa5]{0,}$";
/**
* 英文和数字匹配(不区分大小写)
*/
public static final String LETTER_NUMBER_REG = "^[A-Za-z0-9]+$";
/**
* 非零开头的最多带两位小数的数字
*/
public static final String DECIMAL_REG = "^([1-9][0-9]*)+(.[0-9]{1,2})?$";
/**
* 纯数字
*/
public static final String ONLY_NUMBER_REG = "^[0-9]{1,}$";
/**
* 纯字母
*/
public static final String ONLY_LETTER_REG = "^[a-zA-Z]{1,}$";
/**
* 邮箱email
*/
public static final String EMAIL_REG = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
/**
* 日期规则
*/
public static final String DATE_YMD = "^(\\d{4}-\\d{2}-\\d{2})$";
/**
* 时间规则
*/
public static final String DATE_YMDHDS = "^(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})$";
/**
* 银行卡卡号位数
*/
public final static String BANK_CARD_NUMBER = "^\\d{16}|\\d{19}$";
/**
* 身份证号码位数限制
*/
public final static String ID_CARD = "^\\d{15}|(\\d{17}[0-9,x,X])$";
/**
* 是否为手机号码
*
* @param phone
* @return
* @return boolean
* @author tyg
* @date 2018年9月25日上午9:44:38
*/
public static boolean isPhone(String phone) {
return phone.matches(PHONE_REG);
}
/**
* 是否为座机号码
*
* @param mobile
* @return
* @return boolean
* @author tyg
* @date 2018年9月25日上午9:44:38
*/
public static boolean isMobile(String mobile) {
return mobile.matches(MOBILE_REG);
}
public static void main(String[] args) {
System.out.println(isPhone("13228116626"));
System.out.println(isMobile("028-63358547"));
}
}
package com.mmc.iuav.user.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
/**
* 日志辅助类,用来处理敏感信息,进行脱敏
*
* @author tyg
* @date 2018年5月5日下午4:01:22
*/
public class PrivacyUtil {
//银行账户:显示前六后四,范例:622848******4568
public static String encryptBankAcct(String bankAcct) {
if (bankAcct == null) {
return "";
}
return replaceBetween(bankAcct, 6, bankAcct.length() - 4, null);
}
//身份证号码:显示前六后四,范例:110601********2015
public static String encryptIdCard(String idCard) {
if (idCard == null) {
return "";
}
return replaceBetween(idCard, 6, idCard.length() - 4, null);
}
//客户email:显示前二后四,范例:abxx@xxx.com
public static String encryptEmail(String email) {
//判断是否为邮箱地址
if (email == null || !Pattern.matches(PatternUtil.EMAIL_REG, email)) {
return "";
}
StringBuilder sb = new StringBuilder(email);
//邮箱账号名只显示前两位
int at_position = sb.indexOf("@");
if (at_position > 2) {
sb.replace(2, at_position, StringUtils.repeat("x", at_position - 2));
}
//邮箱域名隐藏
int period_position = sb.lastIndexOf(".");
sb.replace(at_position + 1, period_position, StringUtils.repeat("x", period_position - at_position - 1));
return sb.toString();
}
//手机:显示前三后四,范例:189****3684
public static String encryptPhoneNo(String phoneNo) {
if (phoneNo == null) {
return "";
}
return replaceBetween(phoneNo, 3, phoneNo.length() - 4, null);
}
/**
* @param object 待处理对象
* @param fieldNames 需要处理的属性
* @return 将对象转换为字符串,并对敏感信息进行处理
*/
public static String encryptSensitiveInfo(Object object, String[] fieldNames) {
return encryptSensitiveInfo(object, fieldNames, null);
}
/**
* @param object 待处理对象
* @param fieldNames 需要处理的属性
* @param excludes 不需要显示的属性
* @return 将对象转换为字符串,并对敏感信息进行处理
*/
public static String encryptSensitiveInfo(Object object, String[] fieldNames, String[] excludes) {
if (fieldNames == null) {
fieldNames = new String[0];
}
//合并数组
Set<String> set = new HashSet<String>(Arrays.asList(fieldNames));
if (excludes != null) {
for (int i = 0; i < excludes.length; i++) {
set.add(excludes[i]);
}
}
//将对象转换为字符串
String str = ReflectionToStringBuilder.toStringExclude(object, set.toArray(new String[0]));
//处理敏感信息
StringBuilder sb = new StringBuilder(str);
sb.deleteCharAt(sb.length() - 1);
for (int i = 0; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
try {
Field f = object.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
String value = encryptSensitiveInfo(String.valueOf(f.get(object)));
if (i != 0 || sb.charAt(sb.length() - 1) != '[') {
sb.append(",");
}
sb.append(fieldName).append("=").append(value);
} catch (Exception e) {
}
}
sb.append("]");
str = sb.toString();
return str;
}
/**
* 对敏感信息进行处理。使用正则表达式判断使用哪种规则
*
* @param sourceStr 需要处理的敏感信息
* @return
* @return String
* @author tyg
* @date 2018年5月5日下午3:59:28
*/
public static String encryptSensitiveInfo(String sourceStr) {
if (sourceStr == null) {
return "";
}
if (Pattern.matches(PatternUtil.PHONE_REG, sourceStr)) {
return encryptPhoneNo(sourceStr);
} else if (Pattern.matches(PatternUtil.EMAIL_REG, sourceStr)) {
return encryptEmail(sourceStr);
} else if (Pattern.matches(PatternUtil.BANK_CARD_NUMBER, sourceStr)) {
return encryptBankAcct(sourceStr);
} else if (Pattern.matches(PatternUtil.ID_CARD, sourceStr)) {
return encryptIdCard(sourceStr);
} else {
return sourceStr;
}
}
/**
* 将字符串开始位置到结束位置之间的字符用指定字符替换
*
* @param sourceStr 待处理字符串
* @param begin 开始位置
* @param end 结束位置
* @param replacement 替换字符
* @return
*/
private static String replaceBetween(String sourceStr, int begin, int end, String replacement) {
if (sourceStr == null) {
return "";
}
if (replacement == null) {
replacement = "*";
}
int replaceLength = end - begin;
if (StringUtils.isNotBlank(sourceStr) && replaceLength > 0) {
StringBuilder sb = new StringBuilder(sourceStr);
sb.replace(begin, end, StringUtils.repeat(replacement, replaceLength));
return sb.toString();
} else {
return sourceStr;
}
}
}
\ No newline at end of file
package com.mmc.iuav.user.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author 作者 geDuo
* @version 创建时间:2021年7月17日 下午5:28:19
* @explain 日期时间工具类
*/
public class TDateUtil {
public static final String ONE_WEEK = "oneweek";
public static final String ONE_MONTH = "onemonth";
public static final String THREE_MONTH = "threemonth";
public static final String SIX_MONTH = "sixmonth";
public static final String ONE_YEAR = "oneyear";
public static final String TYPE = "yyyyMMddHHmmss";
public static String getCurrentDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm");// 设置日期格式
String date = df.format(new Date());// new Date()为获取当前系统时间
return date;
}
public static String getCurrentDateByType(String format) {
SimpleDateFormat df = new SimpleDateFormat(format);// 设置日期格式
String date = df.format(new Date());// new Date()为获取当前系统时间
return date;
}
public static String getCurrentDateMidd() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
String date = df.format(new Date());// new Date()为获取当前系统时间
return date;
}
public static Date getDate(String str, String format) {
Date date = null;
try {
SimpleDateFormat df = new SimpleDateFormat(format);// 设置日期格式
// String dates=df.format(new Date());// new Date()为获取当前系统时间
date = df.parse(str);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* date类型转字符串
*/
public static String getDateStr(Date date, String type) {
SimpleDateFormat format = new SimpleDateFormat(type);
String s = format.format(date);
return s;
}
/**
* 根据日期获得随机数
*/
public static Integer getDateRandom(Date date, String format, int count) {
String code = "";
for (int i = 0; i < count; i++) {
code = code + (int) (Math.random() * 9);
}
code = TDateUtil.getDateStr(date, format) + code;
return Integer.parseInt(code);
}
/**
* 10位数的秒转日期字符
*
* @param mss
* @return
*/
public static Date dateFromSecond(long sceondTime) {
return new Date(sceondTime * 1000);
}
/**
* 10位数的秒转日期字符
*
* @param mss
* @return
*/
public static String dateFromSecondStr(long sceondTime) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(sceondTime * 1000));
}
/**
* 秒转时分秒
*
* @param secondTime
* @return
*/
public static String hmsFromSecond(Integer secondTime) {
Integer hour = secondTime / 60 / 60;
Integer minutes = secondTime / 60 % 60;
Integer remainingSeconds = secondTime % 60;
return (hour + "h" + minutes + "min" + remainingSeconds + "s");
}
public static String hmsFromSecondFormat(long secondTime) {
long day = secondTime / 60 / 60 / 24;
long hour = secondTime / 60 / 60 % 24;
long minutes = secondTime / 60 % 60;
long remainingSeconds = secondTime % 60;
if (day > 0) {
return (day + "天" + hour + "小时" + minutes + "分" + remainingSeconds + "秒");
}
return (hour + "小时" + minutes + "分" + remainingSeconds + "秒");
}
/**
* 两个日期的相差秒数
*
* @param maxDate
* @param minDate
* @return
*/
public static long calLastedTime(Date maxDate, Date minDate) {
long a = maxDate.getTime();
long b = minDate.getTime();
long c = (a - b) / 1000;
return c;
}
/**
* 获取某个月的月底最后一天的时间
*/
public static Date getMonthLatestDay(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.setTime(date);
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(ca.getTime());
Date dates = getDate(last, "yyyy-MM-dd");
return dates;
}
/**
* 某个时间 加N天
*/
public static Date nextNumDay(Date d, int num) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
Date now = d;
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.DAY_OF_MONTH, num);
String last = format.format(calendar.getTime());
date = getDate(last, "yyyy-MM-dd");
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* 某天个时间加 N 小时
*
* @param now
* @param num
* @return
*/
public static Date addHourTime(Date now, int num) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.HOUR, num);
String last = format.format(calendar.getTime());
date = getDate(last, "yyyy-MM-dd HH:mm:ss");
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* 某个时间加n个月加n天(负数为减)
*/
@SuppressWarnings("static-access")
public static Date getMonthNDayN(Date date, int month, int day) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date news = null;
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, month);
calendar.add(calendar.DATE, day);
String last = format.format(calendar.getTime());
news = getDate(last, "yyyy-MM-dd");
} catch (Exception e) {
e.printStackTrace();
}
return news;
}
/**
* 时间戳-计算小时
*/
public static long getDistanceTime(long time1, long time2) {
long diff = 0;
long day = 0;
long hour = 0;
if (time1 < time2) {
diff = time2 - time1;
} else {
diff = time1 - time2;
}
day = diff / (24 * 60 * 60 * 1000);
hour = (diff / (60 * 60 * 1000) - day * 24);
return hour;
}
/**
* 两个时间之间相差距离多少天
*
* @param one 时间参数 1:
* @param two 时间参数 2:
* @return 相差天数
*/
public static int distanceDays(Date one, Date two) {
int days = 0;
long time1 = one.getTime();
long time2 = two.getTime();
long diff;
if (time1 < time2) {
diff = time2 - time1;
} else {
diff = time1 - time2;
}
days = new Long(diff / (1000 * 60 * 60 * 24)).intValue();
return days;
}
public static Date nextNumDateTime(Date d, int num) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
Date now = d;
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.DAY_OF_MONTH, num);
String last = format.format(calendar.getTime());
date = getDate(last, "yyyy-MM-dd HH:mm:ss");
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
public static String createYearWeek(String startStr, String endStr) {
if (startStr == null || "".equals(startStr) || endStr == null || "".equals(endStr)) {
return "起止日期不能为空";
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = null;
Date end = null;
Date startDate;
Date endDate;
int dayOfWeek;
boolean goOn = true;
int no = 0;
try {
start = sdf.parse(startStr);
end = sdf.parse(endStr);
} catch (ParseException e) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
try {
start = simpleDateFormat.parse(startStr);
end = simpleDateFormat.parse(endStr);
} catch (ParseException pe) {
pe.printStackTrace();
}
}
if (start.compareTo(end) > -1) {
return "结束日期必须大于开始日期";
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
List<Map<String, String>> weekList = new ArrayList<>();
if (dayOfWeek > 1 && dayOfWeek < 7) {
do {
startDate = start;
calendar.add(Calendar.DATE, (8 - dayOfWeek));
endDate = calendar.getTime();
no += 1;
Map<String, String> map = new HashMap<>();
map.put("startOfWeek", sdf.format(startDate));
map.put("weekNo", no + "");
if (endDate.compareTo(end) < 0) {
map.put("endOfWeek", sdf.format(endDate));
weekList.add(map);
calendar.add(Calendar.DATE, 1);
start = calendar.getTime();
dayOfWeek = 2;
} else {
map.put("endOfWeek", sdf.format(end));
weekList.add(map);
goOn = false;
}
} while (goOn);
} else {
no += 1;
startDate = start;
if (dayOfWeek == 1) {
endDate = start;
} else {
calendar.add(Calendar.DATE, 1);
endDate = calendar.getTime();
}
Map<String, String> map = new HashMap<>();
map.put("startOfWeek", sdf.format(startDate));
map.put("endOfWeek", sdf.format(endDate));
map.put("weekNo", no + "");
weekList.add(map);
calendar.add(Calendar.DATE, 1);
start = calendar.getTime();
do {
startDate = start;
calendar.add(Calendar.DATE, 6);
endDate = calendar.getTime();
no += 1;
map = new HashMap<>();
map.put("startOfWeek", sdf.format(startDate));
map.put("weekNo", no + "");
if (endDate.compareTo(end) < 0) {
map.put("endOfWeek", sdf.format(endDate));
weekList.add(map);
calendar.add(Calendar.DATE, 1);
start = calendar.getTime();
} else {
map.put("endOfWeek", sdf.format(end));
weekList.add(map);
goOn = false;
}
} while (goOn);
}
return weekList.toString();
}
/**
* 获取起止日期
*
* @param sdf 需要显示的日期格式
* @param date 需要参照的日期
* @param n 最近n周
* @param option 0 开始日期;1 结束日期
* @param k 0 包含本周 1 不包含本周
* @return
*/
public static String getFromToDate(SimpleDateFormat sdf, Date date, int n, int option, int k) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int offset = 0 == option ? 1 - dayOfWeek : 7 - dayOfWeek;
int amount = 0 == option ? offset - (n - 1 + k) * 7 : offset - k * 7;
calendar.add(Calendar.DATE, amount);
return sdf.format(calendar.getTime());
}
/**
* 根据当前日期获得最近n周的日期区间(包含本周)
*
* @param n
* @param sdf
* @return
*/
public static String getNWeekTimeInterval(int n, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);// 设置日期格式
String beginDate = getFromToDate(sdf, new Date(), n, 0, 0);
String endDate = getFromToDate(sdf, new Date(), n, 1, 0);
return beginDate + "," + endDate;
}
/**
* 根据当前日期获得最近n周的日期区间(不包含本周)
*
* @param n
* @param sdf
* @return
*/
public static String getNWeekTimeIntervalTwo(int n, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);// 设置日期格式
String beginDate = getFromToDate(sdf, new Date(), n, 0, 1);
String endDate = getFromToDate(sdf, new Date(), n, 1, 1);
return beginDate + "," + endDate;
}
/**
* 根据当前日期获得本周的日期区间(本周周一和周日日期)
*
* @param sdf
* @return
*/
public static String getThisWeekTimeInterval(String format) {
return getNWeekTimeInterval(1, format);
}
/**
* 根据当前日期获得上周的日期区间(上周周一和周日日期)
*
* @param sdf
* @return
*/
public static String getLastWeekTimeInterval(String format) {
return getNWeekTimeIntervalTwo(1, format);
}
/**
* 获取某个日期最近一个的星期日
*
* @return
*/
public static Date getLatestWeekend(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
Date endDate = TDateUtil.nextNumDay(date, w * -1);
return endDate;
}
/**
* 获取N周的星期一的日期(正加负减)
*
* @param date
* @return
*/
public static Date getMinMonday(Date date, int weekNum) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
Date endDate = TDateUtil.nextNumDay(date, w * -1);
Date startDate = TDateUtil.nextNumDay(endDate, (weekNum * 7) + 1);
return startDate;
}
/**
* 获取某个月加几个月后一号的日期
*/
@SuppressWarnings("static-access")
public static Date getAddMonThDay(Date date, int i) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendar.MONTH, i);
calendar.set(Calendar.DAY_OF_MONTH, 1);
String last = format.format(calendar.getTime());
date = getDate(last, "yyyy-MM-dd");
return date;
}
/**
* 某个月最后一天
*/
public static Date getAnyMonthLastDay(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.setTime(date);
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(ca.getTime());
date = getDate(last, "yyyy-MM-dd");
return date;
}
public static Date getDate(Date date, String type) {
SimpleDateFormat format = new SimpleDateFormat(type);
String s = format.format(date);
return getDate(s, type);
}
/**
* 获取去年今天的日期
*/
public static Date getLastYearTodayDate() {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.YEAR, -1);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String s = format.format(instance.getTime());
return getDate(s, "yyyy-MM-dd");
}
/**
* 获取昨天的日期
*
* @param type
* @return
*/
public static String getYesterdayDateByType(String type) {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DAY_OF_MONTH, -1);
Date time = instance.getTime();
SimpleDateFormat format = new SimpleDateFormat(type);
return format.format(time);
}
/**
* 判断两个时间是不是在同一个月
*/
public static boolean isSameMonth(Date date1, Date date2) {
Calendar c = Calendar.getInstance();
c.setTime(date1);
int month1 = c.get(Calendar.MONTH);
c.setTime(date2);
int month2 = c.get(Calendar.MONTH);
if (month1 == month2) {
return true;
}
return false;
}
/**
* 间隔天数
*
* @param startTime
* @param endTime
* @return
*/
public static int isolateDayNum(String startTime, String endTime) {
Date startDate = getDate(startTime, "yyyy-MM-dd");
Date endDate = getDate(endTime, "yyyy-MM-dd");
long differentMillis = endDate.getTime() - startDate.getTime();
long dayNum = differentMillis / (1000 * 60 * 60 * 24);
return (int) dayNum;
}
/**
* 获取某月最后一天的时间
*
* @param yearMonth
* @return
*/
public static String getLastDateTimeOfMonth(String yearMonth) {
SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar instance = Calendar.getInstance();
try {
Date parse = format0.parse(yearMonth);
instance.setTime(parse);
instance.set(Calendar.DAY_OF_MONTH, instance.getActualMaximum(Calendar.DAY_OF_MONTH));
instance.set(Calendar.HOUR_OF_DAY, 23);
instance.set(Calendar.MINUTE, 59);
instance.set(Calendar.SECOND, 59);
String format = format1.format(instance.getTime());
return format;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Date getStrToDate(String str) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
Date date = null;
try {
if (str == null) {
date = null;
} else {
date = dateFormat.parse(str);
}
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static int getStageByDate(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
//当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
String format = dateFormat.format(date);
try {
Date currentTime = dateFormat.parse(format);
Date parse1 = dateFormat.parse("05:00:00");
Date parse2 = dateFormat.parse("11:00:00");
Date parse3 = dateFormat.parse("17:00:00");
Date parse4 = dateFormat.parse("00:00:00");
//A:05:00-11:00 | B:11:00-17:00 | C:00:00-05:00,17:00-00:00
if (currentTime.after(parse4) && currentTime.before(parse1)) {
return 3;
} else if (currentTime.after(parse1) && currentTime.before(parse2)) {
return 1;
} else if (currentTime.after(parse2) && currentTime.before(parse3)) {
return 2;
} else if (currentTime.after(parse3) && currentTime.after(parse4)) {
return 4;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
public static String getCurrentYear() {
Calendar date = Calendar.getInstance();
String year = String.valueOf(date.get(Calendar.YEAR));
return year;
}
}
package com.mmc.iuav.user.xzsz;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/8/22 14:26
*/
public class SingleSubmitResp {
private String isSuccess;
private String charset;
private String errorCode;
private String errorMessage;
private Data data;
public String getIsSuccess() {
return isSuccess;
}
public void setIsSuccess(String isSuccess) {
this.isSuccess = isSuccess;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public static class Data implements Serializable {
private static final long serialVersionUID = 887647888669372371L;
private String outerTradeNo;
public Data() {
}
public String getOuterTradeNo() {
return outerTradeNo;
}
public void setOuterTradeNo(String outerTradeNo) {
this.outerTradeNo = outerTradeNo;
}
}
}
package com.mmc.iuav.user.xzsz;
import java.math.BigDecimal;
/**
* @author: zj
* @Date: 2023/8/22 14:43
*/
public class WithdrawalResp {
private String isSuccess;
private String charset;
private Data data;
public String getIsSuccess() {
return isSuccess;
}
public void setIsSuccess(String isSuccess) {
this.isSuccess = isSuccess;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public static class Data {
private String outerTradeNo;
private String notifyType;
private String empName;
private String empPhone;
private String licenseType;
private String licenseId;
private String settleType;
private String payAccount;
private String positionName;
private BigDecimal payAmount;
private String tradeStatus;
private String tradeTime;
private String frontLogNo;
private String tradeResult;
private String tradeFailCode;
public Data() {
}
public String getOuterTradeNo() {
return outerTradeNo;
}
public void setOuterTradeNo(String outerTradeNo) {
this.outerTradeNo = outerTradeNo;
}
public String getNotifyType() {
return notifyType;
}
public void setNotifyType(String notifyType) {
this.notifyType = notifyType;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getEmpPhone() {
return empPhone;
}
public void setEmpPhone(String empPhone) {
this.empPhone = empPhone;
}
public String getLicenseType() {
return licenseType;
}
public void setLicenseType(String licenseType) {
this.licenseType = licenseType;
}
public String getLicenseId() {
return licenseId;
}
public void setLicenseId(String licenseId) {
this.licenseId = licenseId;
}
public String getSettleType() {
return settleType;
}
public void setSettleType(String settleType) {
this.settleType = settleType;
}
public String getPayAccount() {
return payAccount;
}
public void setPayAccount(String payAccount) {
this.payAccount = payAccount;
}
public String getPositionName() {
return positionName;
}
public void setPositionName(String positionName) {
this.positionName = positionName;
}
public BigDecimal getPayAmount() {
return payAmount;
}
public void setPayAmount(BigDecimal payAmount) {
this.payAmount = payAmount;
}
public String getTradeStatus() {
return tradeStatus;
}
public void setTradeStatus(String tradeStatus) {
this.tradeStatus = tradeStatus;
}
public String getTradeTime() {
return tradeTime;
}
public void setTradeTime(String tradeTime) {
this.tradeTime = tradeTime;
}
public String getFrontLogNo() {
return frontLogNo;
}
public void setFrontLogNo(String frontLogNo) {
this.frontLogNo = frontLogNo;
}
public String getTradeResult() {
return tradeResult;
}
public void setTradeResult(String tradeResult) {
this.tradeResult = tradeResult;
}
public String getTradeFailCode() {
return tradeFailCode;
}
public void setTradeFailCode(String tradeFailCode) {
this.tradeFailCode = tradeFailCode;
}
}
}
......@@ -69,6 +69,28 @@ third-party:
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
xzsz:
# appKey: 1e8e59e056be41f8a05c090964d7ce37
# appSecret: ceshihuanjingyanshizhanghao00000
# aes: 0000000000000000
# domain: https://uat.xzsz.ltd/
# position: 销售推广
# taxFundId: xxxxxxxxxxxxxxxxxxxxxxx
appKey: 37f76305f1864339adc8d6d03fbf918d
appSecret: hangzhouyunxiangfeikeji000000000
aes: '0000000000000000'
domain: https://saas.xzsz.ltd
position: 市场推广
taxFundId: 0b0376083af4435885bd5d5cd3d63053
authNotify: https://test.iuav.shop/userapp/xz/xzAuthNotify
withdrawNotify: https://test.iuav.shop/userapp/xz/xzWithdrawNotify
fdd:
appid: 407664
appkey: q146q3Cjmi7Y6BVl8jtZK9pH
version: 2
host: https://testapi.fadada.com:8443/api/
mmc-url: https://test.iuav.shop/userapp/
iuav:
pay:
......
......@@ -18,7 +18,7 @@ spring:
port: 5672
username: MjphbXFwLWNuLXp2cDJvemhuajAwMTpMVEFJNEZ6Q3B5ckEzM1BlZ254V1M2WFY=
password: RTg3OUMxQzk4NzU0NDQ4RkQ1RDg4MkEzQjY4M0M3MkQxOTM2QkEyNDoxNjUyNDA4NDk0NDg4
virtual-host: /
virtual-host: dev
wx:
sub:
......@@ -38,9 +38,25 @@ third-party:
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
xzsz:
appKey: 1e8e59e056be41f8a05c090964d7ce37
appSecret: ceshihuanjingyanshizhanghao00000
aes: '0000000000000000'
domain: https://uat.xzsz.ltd/
position: 销售推广
taxFundId: 8ae605f565884a1f9a5e91d5a661ce58
authNotify: https://test.iuav.shop/userapp/xz/xzAuthNotify
withdrawNotify: https://test.iuav.shop/userapp/xz/xzWithdrawNotify
fdd:
appid: 407664
appkey: q146q3Cjmi7Y6BVl8jtZK9pH
version: 2
host: https://testapi.fadada.com:8443/api/
mmc-url: https://test.iuav.shop/userapp/
iuav:
pay:
uri: http://127.0.0.1:8088
pms:
uri: http://127.0.0.1:8099
\ No newline at end of file
uri: http://127.0.0.1:8099
......@@ -67,6 +67,15 @@ third-party:
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
xzsz:
appKey: 37f76305f1864339adc8d6d03fbf918d
appSecret: hangzhouyunxiangfeikeji000000000
aes: '0000000000000000'
domain: https://saas.xzsz.ltd
position: 市场推广
taxFundId: 0b0376083af4435885bd5d5cd3d63053
authNotify: https://www.iuav.shop/userapp/xz/xzAuthNotify
withdrawNotify: https://www.iuav.shop/userapp/xz/xzWithdrawNotify
iuav:
pay:
......
......@@ -76,12 +76,22 @@
</where>
</update>
<update id="disableBackUserAccountDO">
update back_user_account
set disable = 1, account_no = #{accountNo}
where disable = 0
and id = #{id}
</update>
<!--
<update id="disableBackUserAccountDO">
update back_user_account
set disable = 1,
account_no = #{accountNo}
where disable = 0
and id = #{id}
</update>
-->
<delete id="disableBackUserAccountDO">
delete
from back_user_account
where id =
#{id}
</delete>
<update id="updatePassword">
update back_user_account
......
......@@ -440,5 +440,26 @@
where phone_num = #{phoneNum}
and disable = 0
</select>
<select id="getUserAccountInfoByOpenId" resultType="com.mmc.iuav.user.entity.UserAccountDO">
select id,
phone_num,
user_name,
nick_name,
user_img,
open_id,
union_id,
user_sex,
email,
`source`,
account_status,
remark,
port_type,
disable,
create_time,
update_time
from user_account
where open_id = #{openid}
and disable = 0
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.UserSubInfoDao">
<resultMap id="userSubInfoResultMap" type="com.mmc.iuav.user.entity.UserSubInfoDO">
<id property="id" column="id" />
<result property="openId" column="open_id" />
<result property="unionId" column="union_id" />
<result property="nickName" column="nick_name" />
<result property="regStatus" column="reg_status" />
<result property="deleted" column="is_deleted" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
</resultMap>
<resultMap id="userSubInfoResultMap" type="com.mmc.iuav.user.entity.UserSubInfoDO">
<id property="id" column="id"/>
<result property="openId" column="open_id"/>
<result property="unionId" column="union_id"/>
<result property="nickName" column="nick_name"/>
<result property="regStatus" column="reg_status"/>
<result property="deleted" column="is_deleted"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="getUserSubInfo" resultMap="userSubInfoResultMap" parameterType="String">
<select id="getUserSubInfo" resultMap="userSubInfoResultMap" parameterType="String">
select u.id,u.open_id,u.union_id,u.nick_name,u.reg_status,
u.is_deleted,u.create_time,u.update_time
from user_sub_info u
where u.open_id = #{openId}
</select>
<select id="getUserSubInfoById" resultMap="userSubInfoResultMap" parameterType="Integer">
<select id="getUserSubInfoById" resultMap="userSubInfoResultMap" parameterType="Integer">
select usi.id,usi.open_id,usi.union_id,usi.nick_name,usi.is_deleted
from user_account ua
inner join user_sub_info usi on usi.union_id=ua.union_id
where usi.is_deleted=0 and ua.is_deleted=0
and ua.user_account_id = #{userAccountId}
</select>
<select id="getUserSubInfoByUnionId" resultMap="userSubInfoResultMap" parameterType="String">
select usi.id,usi.open_id,usi.union_id,usi.nick_name,usi.is_deleted
<select id="getUserSubInfoByUnionId" resultMap="userSubInfoResultMap" parameterType="String">
select usi.id,usi.open_id,usi.union_id,usi.nick_name,usi.is_deleted,usi.reg_status
from user_sub_info usi
where usi.union_id = #{unionId} and usi.is_deleted=0
</select>
<select id="countUserSubInfo" resultType="Integer" parameterType="String">
<select id="countUserSubInfo" resultType="Integer" parameterType="String">
select count(*)
from user_sub_info u
where u.open_id = #{openId} and is_deleted = 0
</select>
<insert id="insertUserSubInfo" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
<insert id="insertUserSubInfo" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
insert into user_sub_info
(
open_id,union_id,nick_name,reg_status,is_deleted,create_time,update_time
......@@ -53,28 +53,28 @@
#{openId},#{unionId},#{nickName},#{regStatus},#{deleted},#{createTime},#{updateTime}
)
</insert>
<update id="removeUserSubInfo" parameterType="String">
<update id="removeUserSubInfo" parameterType="String">
update user_sub_info
set is_deleted = 1
where open_id = #{openId}
</update>
<update id="updateUserSubInfo"
parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
update user_sub_info
<set>
<if test="unionId != null and unionId != '' ">
union_id = #{unionId},
</if>
<if test="nickName != null">
nick_name = #{nickName},
</if>
<if test="regStatus != null">
reg_status = #{regStatus},
</if>
</set>
where open_id = #{openId}
</update>
<update id="updateUserSubInfo"
parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
update user_sub_info
<set>
<if test="unionId != null and unionId != '' ">
union_id = #{unionId},
</if>
<if test="nickName != null">
nick_name = #{nickName},
</if>
<if test="regStatus != null">
reg_status = #{regStatus},
</if>
</set>
where open_id = #{openId}
</update>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.fdd.UserFddAuthDao">
<resultMap id="appUserFddResultMap" type="com.mmc.iuav.user.entity.fdd.UserFddDO">
<id property="id" column="id"/>
<result property="unionId" column="union_id"/>
<result property="customerId" column="customer_id"/>
<result property="personVerifyStatus" column="person_verify_status"/>
<result property="entVerifyStatus" column="ent_verify_status"/>
<result property="accountType" column="account_type"/>
<result property="updateTime" column="update_time"/>
<result property="createTime" column="create_time"/>
</resultMap>
<insert id="insertAppUserFdd" parameterType="com.mmc.iuav.user.entity.fdd.UserFddDO"
keyProperty="id" useGeneratedKeys="true">
insert into user_fdd
(union_id, customer_id, person_verify_status, ent_verify_status, account_type, create_time)
values (#{unionId}, #{customerId}, #{personVerifyStatus}, #{entVerifyStatus}, #{accountType}, NOW())
</insert>
<insert id="insertVerifyInfo" useGeneratedKeys="true" keyProperty="id"
parameterType="com.mmc.iuav.user.entity.fdd.FddVerifyInfoDO">
insert into fdd_verify_info
(user_fdd_id, customer_id, transaction_no, url, create_time)
values (#{userFddId}, #{customerId}, #{transactionNo}, #{url}, NOW())
</insert>
<update id="updateCompanyCertStatus">
update user_fdd
set ent_verify_status = #{status}
where customer_id = #{customerId}
</update>
<select id="checkRegisterFdd" resultType="com.mmc.iuav.user.entity.fdd.UserFddDO">
select id,
union_id,
customer_id,
person_verify_status,
ent_verify_status,
account_type,
create_time,
update_time
from user_fdd
where union_id = #{unionId}
and account_type = #{flag}
and is_deleted = 0
</select>
<select id="getVerifyUrl" resultType="com.mmc.iuav.user.entity.fdd.FddVerifyInfoDO">
select id, user_fdd_id, customer_id, transaction_no, url, create_time, update_time
from fdd_verify_info
where customer_id = #{customerId}
</select>
<select id="getAppUserFddInfo" resultType="com.mmc.iuav.user.entity.fdd.UserFddDO">
select id, customer_id, person_verify_status, ent_verify_status, account_type, create_time, update_time
from user_fdd
where union_id = #{unionId}
</select>
</mapper>
\ No newline at end of file
......@@ -10,6 +10,117 @@
values (#{userAccountId}, #{cashAmt}, #{cashPaid}, #{cashFreeze}, #{salaryAmt}, #{salaryPaid}, #{salaryFreeze},
#{salaryWdl})
</insert>
<insert id="insertPayLogDO">
insert into pay_log (user_account_id,
pay_no,
pay_method,
cash_amt_paid,
salary_amt_paid,
pay_time,
remark,
operate_user)
values (#{userAccountId}, #{payNo}, #{payMethod}, #{cashAmtPaid}, #{salaryAmtPaid}, NOW(), #{remark},
#{operateUser})
</insert>
<insert id="insertWithdrawalLog">
insert into withdrawal_log(user_account_id,
xz_withdrawal_apply_id,
pay_no,
pay_method,
pay_time,
salary_freeze,
salary_paid)
values (#{userAccountId}, #{xzWithdrawalApplyId}, #{payNo}, #{payMethod}, #{payTime}, #{salaryFreeze},
#{salaryPaid})
</insert>
<update id="updatePayWallet">
update pay_wallet
<set>
<if test="pid != null">
pid = #{pid} + 1,
</if>
<if test="cashAmt != null">
cash_amt = #{cashAmt},
</if>
<if test="cashFreeze != null">
cash_freeze = #{cashFreeze},
</if>
<if test="salaryAmt != null">
salary_amt = #{salaryAmt},
</if>
<if test="salaryFreeze != null">
salary_freeze = #{salaryFreeze},
</if>
<if test="wdlFreeze != null">
wdl_freeze = #{wdlFreeze},
</if>
<if test="salaryWdl != null">
salary_wdl =#{salaryWdl}
</if>
</set>
where user_account_id = #{userAccountId} and pid = #{pid}
</update>
<update id="updateWithdrawalApply">
update xz_withdrawal_apply
<set>
<if test="applyStatus != null">
apply_status = #{applyStatus},
</if>
<if test="approveUser != null">
approve_user = #{approveUser},
</if>
<if test="approveTime != null">
approve_time = #{approveTime},
</if>
<if test="remark != null and remark != ''">
remark = #{remark},
</if>
<if test="chargeAmount != null">
charge_amount = #{chargeAmount},
</if>
<if test="tradeStatus != null">
trade_status = #{tradeStatus},
</if>
<if test="tradeResult != null">
trade_result = #{tradeResult},
</if>
<if test="remarks != null">
remarks = #{remarks},
</if>
<if test="taxFundId != null">
tax_fund_id = #{taxFundId},
</if>
<if test="wechatAppId !=null">
wechat_app_id = #{wechatAppId},
</if>
<if test="tradeTime !=null">
trade_time = #{tradeTime},
</if>
<if test="frontLogNo !=null">
front_log_no = #{frontLogNo},
</if>
<if test="tradeFailCode !=null">
trade_fail_code = #{tradeFailCode},
</if>
<if test="submitStatus !=null">
submit_status = #{submitStatus},
</if>
<if test="errorCode != null">
error_code = #{errorCode},
</if>
<if test="errorMessage != null">
error_message =#{errorMessage}
</if>
</set>
<where>
<if test="id != null">
id = #{id}
</if>
<if test="outerTradeNo != null">
outer_trade_no = #{outerTradeNo}
</if>
</where>
</update>
<select id="getPayWalletByUser" resultType="com.mmc.iuav.user.entity.wallet.PayWalletDO">
select id,
......@@ -21,9 +132,283 @@
salary_amt,
salary_paid,
salary_freeze,
wdl_freeze,
salary_wdl,
create_time
from pay_wallet
where user_account_id = #{userAccountId}
</select>
</mapper>
\ No newline at end of file
<select id="getPayLog" resultType="com.mmc.iuav.user.entity.wallet.PayLogDO">
SELECT pl.id,
pl.user_account_id,
pl.pay_no,
pl.pay_method,
pl.cash_amt_paid,
pl.salary_amt_paid,
pl.pay_time,
pl.remark,
pl.operate_user,
pl.create_time,
wd.`name`
FROM pay_log pl
INNER JOIN wallet_dictionary wd ON pl.pay_method = wd.`code`
<where>
pl.user_account_id = #{userAccountId}
<if test="startTime != null and startTime != '' ">
and pl.pay_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and pl.pay_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
</where>
ORDER BY pl.create_time DESC
limit #{pageNo}
, #{pageSize}
</select>
<select id="countPayLog" resultType="java.lang.Integer">
select count(*)
from pay_log pl
<where>
pl.user_account_id = #{userAccountId}
<if test="startTime != null and startTime != '' ">
and pl.pay_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and pl.pay_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
</where>
</select>
<select id="getPayLogById" resultType="com.mmc.iuav.user.entity.wallet.PayLogDO">
SELECT pl.id,
pl.user_account_id,
pl.pay_no,
pl.pay_method,
pl.cash_amt_paid,
pl.salary_amt_paid,
pl.pay_time,
pl.remark,
pl.operate_user,
pl.create_time,
wd.`name`
FROM pay_log pl
INNER JOIN wallet_dictionary wd ON pl.pay_method = wd.`code`
WHERE pl.id = #{id}
</select>
<select id="getWithdrawalListByUserAccountId"
resultType="com.mmc.iuav.user.entity.XzWithdrawalApplyDO">
select id,
apply_status,
user_account_id,
bank_name,
bank_remo,
emp_num,
emp_name,
emp_phone,
license_id,
license_type,
`month`,
notify_url,
outer_trade_no,
pay_account,
pay_amount,
position_name,
remarks,
settle_type,
tax_fund_id,
wechat_app_id,
trade_status,
trade_time,
front_log_no,
trade_fail_code,
trade_result,
submit_status,
error_code,
error_message,
charge_amount,
pay_time,
create_time
from xz_withdrawal_apply
<where>
user_account_id = #{userAccountId}
<if test="startTime != null and startTime != '' ">
and create_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d %H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and create_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d %H:%i:%s')
</if>
</where>
order by create_time DESC
limit #{pageNo},#{pageSize}
</select>
<select id="getWithdrawalApplyByIdOrOuterTradeNo" resultType="com.mmc.iuav.user.entity.XzWithdrawalApplyDO">
select id,
apply_status,
user_account_id,
bank_name,
bank_remo,
emp_num,
emp_name,
emp_phone,
license_id,
license_type,
`month`,
notify_url,
outer_trade_no,
pay_account,
pay_amount,
position_name,
remarks,
settle_type,
tax_fund_id,
wechat_app_id,
trade_status,
trade_time,
front_log_no,
trade_fail_code,
trade_result,
submit_status,
error_code,
error_message,
charge_amount,
pay_time,
create_time
from xz_withdrawal_apply
<where>
<if test="id != null">
id = #{id}
</if>
<if test="outerTradeNo != null and outerTradeNo != ''">
outer_trade_no = #{outerTradeNo}
</if>
</where>
</select>
<select id="listPayWithdrawalLog" resultType="com.mmc.iuav.user.entity.wallet.WithdrawalLogDO">
select id,
user_account_id,
xz_withdrawal_apply_id,
pay_no,
pay_method,
pay_time,
salary_freeze,
create_time
from withdrawal_log
where xz_withdrawal_apply_id = #{id}
order by pay_time asc
</select>
<select id="countPayWithdrawalLog" resultType="java.lang.Integer">
select count(*)
from xz_withdrawal_apply
<where>
user_account_id = #{userAccountId}
<if test="startTime != null and startTime != '' ">
and create_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and create_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
</where>
</select>
<select id="countWithdrawalApply" resultType="java.lang.Integer">
select count(*)
from xz_withdrawal_apply
<where>
1 = 1
<if test="tradeStatus != null">
and trade_status = #{tradeStatus}
</if>
<if test="startTime != null and startTime != '' ">
and create_time &gt;=
STR_TO_DATE(#{startTime},'%Y-%m-%d %H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and create_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test="settleType != null and settleType != '' ">
and settle_type = #{settleType}
</if>
<if test="keyword != null and keyword != '' ">
and (
emp_name like CONCAT('%',#{keyword},'%')
or
emp_phone like CONCAT('%',#{keyword},'%')
or pay_account like
CONCAT('%',#{keyword},'%')
or outer_trade_no like
CONCAT('%',#{keyword},'%')
)
</if>
</where>
</select>
<select id="listPageWithdrawalApply" resultType="com.mmc.iuav.user.entity.XzWithdrawalApplyDO">
select id,
user_account_id,
apply_status,
bank_name,
bank_remo,
emp_num,
emp_name,
emp_phone,
license_id,
license_type,
`month`,
notify_url,
outer_trade_no,
pay_account,
pay_amount,
position_name,
remarks,
settle_type,
tax_fund_id,
wechat_app_id,
trade_status,
trade_time,
front_log_no,
trade_fail_code,
trade_result,
submit_status,
error_code,
error_message,
charge_amount,
create_time,
pay_time,
remark
from xz_withdrawal_apply
<where>
1 = 1
<if test="tradeStatus != null">
and trade_status = #{tradeStatus}
</if>
<if test="startTime != null and startTime != '' ">
and create_time &gt;=
STR_TO_DATE(#{startTime},'%Y-%m-%d %H:%i:%s')
</if>
<if test="endTime != null and endTime != '' ">
and create_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test="settleType != null and settleType != '' ">
and settle_type = #{settleType}
</if>
<if test="keyword != null and keyword != '' ">
and (
emp_name like CONCAT('%',#{keyword},'%')
or
emp_phone like CONCAT('%',#{keyword},'%')
or pay_account like
CONCAT('%',#{keyword},'%')
or outer_trade_no like
CONCAT('%',#{keyword},'%')
)
</if>
</where>
order by create_time desc
limit #{pageNo},#{pageSize}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.xzsz.WithdrawalDao">
<insert id="insertWithdrawalApply" useGeneratedKeys="true" keyProperty="id"
parameterType="com.mmc.iuav.user.entity.XzWithdrawalApplyDO">
insert into xz_withdrawal_apply (user_account_id,
bank_name,
emp_name,
emp_phone,
license_id,
license_type,
`month`,
outer_trade_no,
pay_account,
pay_amount,
position_name,
settle_type,
trade_status)
values (#{userAccountId}, #{bankName}, #{empName}, #{empPhone}, #{licenseId}, #{licenseType}, #{month},
#{outerTradeNo}, #{payAccount}, #{payAmount}, #{positionName}, #{settleType}, #{tradeStatus})
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.iuav.user.dao.xzsz.XzDao">
<insert id="addAuth" parameterType="com.mmc.iuav.user.entity.XzAuthDO" useGeneratedKeys="true" keyProperty="id">
insert into xz_auth(user_account_id, `name`, id_card_no, mobile, bank_account, subsidiary_name, document_id,
custom_params, contract_url, xz_auth_status, create_time)
values (#{userAccountId}, #{name}, #{idCardNo}, #{mobile}, #{bankAccount}, #{subsidiary_name}, #{document_id},
#{customParams}, #{contract_url}, #{xzAuthStatus}, NOW())
</insert>
<select id="getXzAuthByUserAccountId" resultType="com.mmc.iuav.user.entity.XzAuthDO">
select id,
user_account_id,
`name`,
id_card_no,
mobile,
bank_account,
subsidiary_name,
document_id,
custom_params,
contract_url,
create_time,
xz_auth_status
from xz_auth
where user_account_id = #{userAccountId}
and is_deleted = 0
</select>
</mapper>
......@@ -29,4 +29,8 @@ data-filter:
- /userapp/cooperation/appBrandMessage
- /userapp/pilot/detailPilot
- /userapp/pilot/appListPilot
- /userapp/xz/xzAuthNotify
- /userapp/xz/xzWithdrawNotify
- /userapp/pay/feignTopUpCash
- /userapp/pay/feignWalletFlowNO
......@@ -18,4 +18,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/cms
newTag: af55c66e9935fdc316c1f338ca46fe45bc16a77f
newTag: 902a215520b53a526b6a1c467371e1a4b02f89bd
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论