提交 9327e999 作者: xiaowang

用户钱包的扣除

上级 8b2197a6
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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author LW
* @date 2023/8/19 16:24
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TopUpCashVO {
private Integer userAccountId;
private String orderNo;
private Integer amount;
private String tradeState;
}
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;
}
......@@ -3,12 +3,10 @@ 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.model.dto.wallet.PayWalletDTO;
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 org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
......@@ -50,4 +48,20 @@ public class PayWalletController extends BaseController {
return payWalletService.initPayWallet(userAccountId);
}
@ApiOperation(value = "feign-云享金充值接口")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@ApiIgnore
@GetMapping("feignTopUpCash")
public ResultBody feignTopUpCash(@RequestParam Integer userAccountId) {
// return payWalletService.feignTopUpCash(userAccountId);
return null;
}
@ApiOperation(value = "feign-钱包流水记录")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("feignWalletFlow")
public ResultBody feignWalletFlow(@RequestBody WalletFlowVO walletFlowVO) {
return payWalletService.feignWalletFlow(walletFlowVO);
}
}
package com.mmc.iuav.user.dao.wallet;
import com.mmc.iuav.user.entity.wallet.PayLogDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import org.apache.ibatis.annotations.Mapper;
......@@ -13,4 +14,8 @@ public interface PayWalletDao {
PayWalletDO getPayWalletByUser(Integer userAccountId);
void insertPayWalletInfo(PayWalletDO wallet);
void insertPayLogDO(PayLogDO payWalletDO);
int updatePayWallet(PayWalletDO updatePayWallet);
}
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,17 @@ public class PayLogDO implements Serializable {
*/
private String payNo;
/**
* 0手动变更(大于0充值or小于0扣除) 100订单扣除 150订单冻结 200订单完成 250提现扣除
* 0手动变更(大于0充值or小于0扣除) 50订单取消 100订单扣除 150订单冻结 200订单完成 250充值 300 提现扣除
*/
private Integer payMethod;
/**
* 云享金变动金额(正数充值,负数扣除)
*/
private Double cashAmtPaid;
private BigDecimal cashAmtPaid;
/**
* 佣金变动金额(正数入账,负数扣除)
*/
private Double salaryAmtPaid;
private BigDecimal salaryAmtPaid;
/**
* 支付时间
*/
......@@ -53,103 +61,5 @@ public class PayLogDO implements Serializable {
private Date createTime;
private Date updateTime;
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 void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
......@@ -53,6 +53,8 @@ public class PayWalletDO implements Serializable {
*/
private BigDecimal salaryFreeze;
private BigDecimal wxCashFreeze;
/**
* 提现总额
*/
......@@ -78,6 +80,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.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_GT(1000, "飞手确认修改金额大于原订单状态"),
FLYING_HAND_CONFIRM_LT(1000, "飞手确认修改金额小于原订单状态");
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.service.wallet;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.vo.wallet.WalletFlowVO;
/**
* @Author LW
......@@ -11,4 +12,6 @@ public interface PayWalletService {
ResultBody getPayWalletInfo(Integer userAccountId);
ResultBody initPayWallet(Integer userAccountId);
ResultBody feignWalletFlow(WalletFlowVO walletFlowVO);
}
package com.mmc.iuav.user.service.wallet.impl;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.dao.wallet.PayWalletDao;
import com.mmc.iuav.user.entity.wallet.PayLogDO;
import com.mmc.iuav.user.entity.wallet.PayWalletDO;
import com.mmc.iuav.user.enums.PayMethodEnums;
import com.mmc.iuav.user.model.dto.wallet.PayWalletDTO;
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.WalletFlowVO;
import com.mmc.iuav.user.service.wallet.PayWalletService;
import com.mmc.iuav.user.util.TDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author LW
......@@ -15,6 +26,7 @@ import javax.annotation.Resource;
* 概要:
*/
@Service
@Slf4j
public class PayWalletServiceImpl implements PayWalletService {
@Resource
PayWalletDao payWalletDao;
......@@ -38,4 +50,371 @@ 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) {
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时 发布方取消订单,有飞手接单
if (publisherWalletFlowVO.getYxjCashPledge() == null) {
publisherWalletFlowVO.setYxjCashPledge(BigDecimal.ZERO);
}
if (publisherWalletFlowVO.getSalaryCashPledge() == null) {
publisherWalletFlowVO.setSalaryCashPledge(BigDecimal.ZERO);
}
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()));
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(publisherWalletFlowVO.getSalaryAmount()));
publishUpdatePayWallet.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(publisherWalletFlowVO.getSalaryAmount()).add(publisherWalletFlowVO.getSalaryCashPledge()));
// 更新发布者钱包数据
int publishUpdateCount = payWalletDao.updatePayWallet(publishUpdatePayWallet);
if (publishUpdateCount <= 0) {
log.error("发布方取消订单,有飞手接单时,发单方用户钱包更新失败,更新参数是:{},发单方用户id是:{},传入参数是:{}", publishUpdatePayWallet, publisherWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
return ResultBody.error("钱包操作错误");
}
PayLogDO publishPayLogDO = buildPayLogDO(publisherWalletFlowVO, null);
// 插入发布者流水记录表
payWalletDao.insertPayLogDO(publishPayLogDO);
// 飞手钱包更新信息
PayWalletDO flyerUpdatePayWallet = new PayWalletDO();
// 断言此处必定不为空
assert flyerWalletFlowVO != null;
flyerUpdatePayWallet.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
flyerUpdatePayWallet.setPid(flyerWallet.getPid());
flyerUpdatePayWallet.setSalaryAmt(flyerWallet.getSalaryAmt().add(publisherWalletFlowVO.getPercentagePenaltyOfOrder()));
int flyerUpdateCount = payWalletDao.updatePayWallet(flyerUpdatePayWallet);
if (flyerUpdateCount > 0) {
PayLogDO flyerPayLogDO = buildPayLogDO(publisherWalletFlowVO, flyerWalletFlowVO);
flyerPayLogDO.setCashAmtPaid(publisherWalletFlowVO.getPercentagePenaltyOfOrder());
flyerPayLogDO.setOperateUser(publisherWalletFlowVO.getOperateUserAccountId());
// 插入流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
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("钱包操作错误");
}
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
flyerPayLogDO.setCashAmtPaid(flyerWalletFlowVO.getYxjCashPledge());
flyerPayLogDO.setSalaryAmtPaid(flyerWalletFlowVO.getSalaryAmount());
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
// 飞手钱包更新信息
PayWalletDO publishUpdatePayWallet = new PayWalletDO();
// 断言此处必定不为空
assert publisherWalletFlowVO != null;
publishUpdatePayWallet.setUserAccountId(flyerWalletFlowVO.getUserAccountId());
publishUpdatePayWallet.setPid(flyerWallet.getPid());
publishUpdatePayWallet.setSalaryAmt(publishWallet.getSalaryAmt().add(flyerWalletFlowVO.getPercentagePenaltyOfOrder()));
int publishUpdateCount = payWalletDao.updatePayWallet(flyerUpdatePayWallet);
if (publishUpdateCount > 0) {
PayLogDO publishPayLogDO = buildPayLogDO(publisherWalletFlowVO, flyerWalletFlowVO);
publishPayLogDO.setCashAmtPaid(flyerWalletFlowVO.getPercentagePenaltyOfOrder());
publishPayLogDO.setOperateUser(flyerWalletFlowVO.getOperateUserAccountId());
// 插入流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
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().subtract(publisherWalletFlowVO.getCashAmount())
.add(publisherWalletFlowVO.getUrgentYxjAmount()).add(publisherWalletFlowVO.getTopYxjAmount()));
publishPayWalletDO.setSalaryFreeze(publishWallet.getSalaryFreeze().subtract(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) {
// 记录流水记录
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
flyerPayLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getFlyerSalaryAmount());
flyerPayLogDO.setOperateUser(publisherWalletFlowVO.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) {
// 记录流水记录
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
flyerPayLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getFlyerSalaryAmount());
flyerPayLogDO.setOperateUser(publisherWalletFlowVO.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) {
// 记录流水记录
PayLogDO flyerPayLogDO = buildPayLogDO(null, flyerWalletFlowVO);
flyerPayLogDO.setSalaryAmtPaid(publisherWalletFlowVO.getFlyerSalaryAmount());
flyerPayLogDO.setOperateUser(publisherWalletFlowVO.getUserAccountId());
// 插入接单者流水记录表
payWalletDao.insertPayLogDO(flyerPayLogDO);
return ResultBody.success();
} else {
log.error("飞手确认修改金额小于原订单状态,接单方用户钱包更新失败,接单者id是:{},发布者传参是:{}", flyerWalletFlowVO.getUserAccountId(), publisherWalletFlowVO);
}
}
return ResultBody.error("钱包操作错误");
}
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()));
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) {
if (publisherWalletFlowVO.getCashAmount() == null) {
publisherWalletFlowVO.setCashAmount(BigDecimal.ZERO);
}
if (publisherWalletFlowVO.getSalaryAmount() == null) {
publisherWalletFlowVO.setSalaryAmount(BigDecimal.ZERO);
}
// 生成支付流水号(规则"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;
}
}
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;
}
}
......@@ -10,6 +10,42 @@
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}, #{payTime}, #{remark},
#{operateUser})
</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="salaryWdl != null">
salary_wdl =#{salaryWdl}
</if>
</set>
where user_account_id = #{userAccountId} and pid = #{pid}
</update>
<select id="getPayWalletByUser" resultType="com.mmc.iuav.user.entity.wallet.PayWalletDO">
select id,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论